【动态规划】洛谷P2196 挖地雷

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82791390

大意

给定一些点和它们间的通道,问最大总点值


思路

一道比较简单的 d p dp

f [ i ] f[i] 表示终点为 i i 的最大值,显然
f [ i ] = m a x { f [ i ] } + a [ i ] f[i]=max\{f[能到达i的点]\}+a[i]

动态转移即可,需要注意的是,要保存所有点的最优解


代码

#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]);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82791390
今日推荐