题目:
分析:和滑雪问题一样。
代码:
#include<bits/stdc++.h>
using namespace std;
int A[20][20];
int B[20];
int n;
int D[20];
int f(int x)
{
if(D[x]!=-1) return D[x];
D[x]=0;
for(int i=x+1;i<n;i++)
{
if(A[x][i]) D[x]=max(D[x],f(i));
}
return D[x]=B[x]+D[x];
}
void out(int x)
{
int maxx=-1;
for(int i=x+1;i<n;i++)
{
if(A[x][i])
{
if(D[maxx]<D[i])
{
maxx=i;
}
}
}
if(maxx==-1) return;
cout<<' '<<maxx+1;
out(maxx);
}
int main()
{
memset(A,0,sizeof(A));
memset(D,-1,sizeof(D));
cin>>n;
for(int i=0;i<n;i++) cin>>B[i];
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++) cin>>A[i][j];
int maxx=-1;
for(int i=0;i<n;i++)
maxx=max(maxx,f(i));
for(int i=0;i<n;i++)
{
if(maxx==D[i])
{
cout<<i+1;
out(i);
break;
}
}
cout<<endl<<maxx;
}