【BZOJ3997】组合数学,总之是DP就对了

传送门
写在前面:同脑补了好久的题目,感觉……
思路:一开始也是在胡思乱想,感觉发现了一些性质,然后就是半弃疗状态,看题解发现如果纯粹看代码理解,感觉好像还挺科学的,看了看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并没有进步多少啊……

你可能感兴趣的:(【BZOJ3997】组合数学,总之是DP就对了)