P1044方格取数

本文介绍了如何使用动态规划解决一个二维方格取数问题,通过状态转移方程和四个决策情况,计算从起点到终点的路径数字之和。代码展示了C++实现的过程。
摘要由CSDN通过智能技术生成

P1044方格取数(刷题笔记)

题目

题目链接
参考的b站视频

分析

可同时处理两端路径,如果走到了相同的点,就只加数字一次。

起点到任何一个点所需的时间t=x+y-1,那么终点的t=2*n-1

阶段: 时间i,两次的纵坐标为y1,y2

状态: f[i][y1][y2]表示两个路径分别走到(i-y1+1,y1)和(i-y2+1,y2)的数字之和

决策: (四种情况:两个路径分别从左、左 || 上、左 || 左、上 ||上、上 走来)
f[i][y1][y2]=max( f[i-1][y1][y2], f[i-1][y1-1][y2], f[i-1][y1][y2-1], f[i-1][y1-1][y2-1] )+(判断是否走到了同一点,走到了同一点则加一次,不同则两个都加)

答案: f[2*n-1][n][n]

代码

#include<bits/stdc++.h>
using namespace std;

const int N = 10;
int n,x,y,num,w[N][N],f[N*2][N][N];
int main(){
	cin>>n;

	
	while(cin>>x>>y>>num && x && y && num){
		w[x][y] = num;
	}
	
	for(int i = 1;i<=2*n-1;i++){
		for(int y1 = 1;y1<=i;y1++){
			for(int y2 = 1;y2<=i;y2++){
				int x1 = i-y1+1,x2 = i-y2+1;
				f[i][y1][y2] = max({f[i-1][y1][y2],f[i-1][y1-1][y2],f[i-1][y1][y2-1],f[i-1][y1-1][y2-1]})+w[x1][y1]+(y1 == y2 ? 0 : w[x2][y2]);
			}
		}
	}
	cout<<f[2*n-1][n][n];
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值