#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int sum[50];//每个地窖的价值
bool l[50][50];// 是否有通路
long long j[50];//每个地窖可以有的最大价值
long long p[50];//每个地窖的最佳通路
int jl[50];//最后输出的最佳通路
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sum[i];
j[i]=sum[i];//每个地窖的初始最大价值就是他自己
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
cin>>l[i][j];
}
}
int max=j[1],z=0;//z是最佳终点
for(int i=2;i<=n;i++)
{
for(int k=1;k<=n;k++)
{
if(k==i)continue;
if(l[i][k]==1||l[k][i]==1)
{
if(j[k]+sum[i]>j[i])
{
j[i]=sum[i]+j[k];
p[i]=k;
}
}
}
if(j[i]>max)
{
max=j[i];
z=i;
}
}
int i;
jl[0]=z;
for(i=1;;i++)
{
jl[i]=p[jl[i-1]];
if(jl[i]==0)break;
}
for(int j=i-1;j>=0;j--)
{
cout<<jl[j]<<" ";
}
cout<<endl;
cout<<max<<endl;
return 0;
}
加了注释 用dp做的