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

本文通过一道关于路径覆盖的问题,探讨了动态规划(DP)在解决特定类型问题时的应用。通过对点(i,j)的特性分析,阐述了如何利用f[i][j]存储从(i,j)出发到上方边界所需步骤数,并提出了一种理解f[i][j]计算方式的方法。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值