Dp-数字三角形模型,证明传纸条和方格取数的等价性

题目链接:https://www.acwing.com/problem/content/description/277/

方格取数中, 在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
在传纸条中, 班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙,反之亦然。

方格取数中,经过的点可以再次经过,只不过没有数可以取了,只能取0了。在传纸条中,传过一次的人第二次就不会帮忙了,传到这里就卡住了。这俩看起来还是存在不同的。现在证明在取到最优解的时候,来回的两条路线不会有交叉,方格取数的最优解中也不会有交叉。所以这道题也可以用方格取数来做。

参考链接:AcWing 275. 证明传纸条为何可以使用方格取数的代码

问:在这里插入图片描述
答:
在这里插入图片描述

代码:

//这道题和方格取数是一样的,收藏了题解,有证明
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=55;

int n, m;
int g[N][N];
int f[N*2][N][N];

int main()
{
    cin>>n>>m;
    
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            scanf("%d", &g[i][j]);
            
    for(int k=2; k<=n+m; k++)
        for(int i=1; i<k; i++)
            for(int j=1;j<k;j++){
                int &v = f[k][i][j];
                int tmp = g[i][k-i];
                if(i!=j){
                    tmp += g[j][k-j];

                }
                v = max(f[k - 1][i - 1][j], v);
                v = max(f[k - 1][i - 1][j - 1], v);
                v = max(f[k - 1][i][j - 1], v);
                v = max(f[k - 1][i][j], v);
                v += tmp;    

            }
    
    printf("%d\n", f[n+m][n][n]);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值