方格取数题解(线性dp)

在这里插入图片描述
在这里插入图片描述

方格取数
题目分析
本题目是考察了dp中的数字三角形模型,只不过从一维上升到了二维。其中f[ i1 , j1 , i2 , j2 ]​​ : 由数字三角形可以推广出从(1,1),(1,1)​(1,1),(1,1)​走到(i1,j1),(i2,j2)​(i1,j1),(i2,j2)​能获得的最大花生数目.

为什么不能分开走
分开两次走(贪心):第一次走到(n, n)求出最大值并记录路径令路径上点收益为0后再走一次。
第一次走为局部最优并且也对第二次走造成了影响,第二次走是在第一次影响下所能走的局部最优,不具备“无后效性”,因此分开两次走并不是全局最优解
主要思想
把 f[i1][j1][i2][j2]f[i1][j1][i2][j2] 转化为 f[k][i1][i2]。
其中k=i1+j1=i2+j2k=i1+j1=i2+j2: 两个小朋友同时走, 每个人走的步数和是一样的。即
在这里插入图片描述
故代码为

#include<iostream>
#include<algorithm>

using namespace std;

const int N=15;

int w[N][N];
int f[2*N][N][N];

int main()
{
    int n;cin>>n;
    int a,b,c;
    while(cin>>a>>b>>c,a||b||c) w[a][b]=c;
    
    for(int k=1;k<=2*n;k++)
        for(int i1=1;i1<=n;i1++)
            for(int i2=1;i2<=n;i2++)
            {
                int j1=k-i1,j2=k-i2;
                if(j1<=n&&j1>=1&&j2<=n&&j2>=1) //判断是否越界
                {
                    int t=w[i1][j1];
                    if(i1!=i2)    //判断两个人是否走到同一方格
                    t+=w[i2][j2];
                    
                    int &x=f[k][i1][i2];       
                    x=max(x,f[k-1][i1-1][i2-1]+t);
                    x=max(x,f[k-1][i1][i2-1]+t);
                    x=max(x,f[k-1][i1-1][i2]+t);
                    x=max(x,f[k-1][i1][i2]+t);
                }
            }
            
    cout<<f[2*n][n][n]<<endl;
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值