2020CSP-J普及组第二轮试题及解析(第四题方格取数number)

参考程序代码:


#include <iostream>
#include <algorithm>
#include <cstring>
#define int long long

using namespace std;

#define N 1010
#define For(i,j,k) for(int i=j;i<=k;i++)
#define IOS ios::sync_with_stdio(),cin.tie(),cout.tie()

int n, m, a[N][N], dp_up[N][N], dp_down[N][N];

void init () {
	For (i, 1, n) {
		For (j, 1, n) {
			dp_up[i][j] = dp_down[i][j] = -1e18;
		}
	} //将全图初始值赋为一个很小的值
	dp_up[1][1] = a[1][1];
	dp_down[1][1] = a[1][1]; //将出发点 dp 值赋为 a[1][1]
	return ;
}

signed main() {
	IOS;
	cin >> n >> m;

	For (i, 1, n) {
		For (j, 1, m) {
			cin >> a[i][j];
		}
	}

	init (); //初始化 dp 数组

	For (i, 2, n) {
		dp_up[i][1] = dp_up[i - 1][1] + a[i][1];
		dp_down[i][1] = dp_down[i - 1][1] + a[i][1];
	} //初始化第一列,其值为其上面的数的 dp 值加上这个点的权值。

	For (j, 2, m) {
		For (i, 1, n) {
			int t = max (dp_up[i][j - 1], dp_down[i][j - 1]);
			dp_up[i][j] = dp_down[i][j] = t + a[i][j];
		} //将其先赋值为上一列同一行的数往右走一步得到的价值

		For (i, 2, n) {
			int t = dp_up[i - 1][j] + a[i][j];
			dp_up[i][j] = max (dp_up[i][j], t);
		} //模拟向下走得到的价值,将其与向右走得到的价值取 max

		for (int i = n - 1; i >= 1; i --) {//因为往上走要先更新下面点的 dp 值,所以需要倒序循环。
			int t = dp_down[i + 1][j] + a[i][j];
			dp_down[i][j] = max (dp_down[i][j], t);
		} //模拟向上走得到的价值,将其与向右走得到的价值取 max
	}
	
	//答案为方案1的最大价值与方案2的最大价值中的较大值
	cout << max (dp_up[n][m], dp_down[n][m]) << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值