版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82791390
大意
给定一些点和它们间的通道,问最大总点值
思路
一道比较简单的
设
表示终点为
的最大值,显然
动态转移即可,需要注意的是,要保存所有点的最优解
代码
#include<cstdio>
using namespace std;int wwds[21],f[21],n,a[21],ans=1;
bool ok[21][21];
inline void putit(register int x)
{
if(!x)return;
putit(wwds[x]);
printf("%d ",x);
}
signed main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d",a+i),f[i]=a[i];
for(register int i=1;i<n;i++) for(register int j=i+1;j<=n;j++) scanf("%d",&ok[i][j]);
for(register int i=1;i<n;i++)
{
for(register int j=i+1;j<=n;j++)
if(f[i]+a[j]>f[j]&&ok[i][j])
{
f[j]=f[i]+a[j];
wwds[j]=i;
}
if(f[i]>f[ans]) ans=i;
}
if(f[n]>f[ans]) ans=n;
putit(ans);
printf("\n%d",f[ans]);
}