传送门
写在前面:同脑补了好久的题目,感觉……
思路:一开始也是在胡思乱想,感觉发现了一些性质,然后就是半弃疗状态,看题解发现如果纯粹看代码理解,感觉好像还挺科学的,看了看DAG路径覆盖相关的东西,woc……
个人理解是说,对于点(i,j)来说,点(i-1,j+1)不和它联通,对于任一个f[i][j],它存储的都是以(i,j)为左下端点一直到往上的方格图中需要走的次数
所以大体就是说f[i][j]可以是f[i-1][j+1]+a[i][j]
(不和(i-1,j+1)联通,所以f[i][j]一定大于等于(i-1,j+1)的方案数+自己的权值数)
f[i-1][j]与f[i][j+1]在这里可以看作是矩阵间的合并求最大……
总之就是YY……也不知道这种理解是否正确
注意:f数组要初始化,答案用LL存储
#include<cstdio>
#include<iostream>
#define LL long long
using namespace std;
int T,n,m;
int a[1002][1002];
LL f[1002][1002];
main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) scanf("%d",&a[i][j]);
for (int i=1;i<=n;i++)
for (int j=m;j;j--) f[i][j]=max(max(f[i-1][j],f[i][j+1]),f[i-1][j+1]+a[i][j]);
printf("%lld\n",f[n][1]);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) f[i][j]=0;
}
}
感觉DP并没有进步多少啊……
本文通过一道关于路径覆盖的问题,探讨了动态规划(DP)在解决特定类型问题时的应用。通过对点(i,j)的特性分析,阐述了如何利用f[i][j]存储从(i,j)出发到上方边界所需步骤数,并提出了一种理解f[i][j]计算方式的方法。

3924

被折叠的 条评论
为什么被折叠?



