hdu4791 Labyrinth

动态规划,对于每列,分别从上到下,从下到上,计算两种情况产生的最大值,然后取最大值。

#include<iostream>
using namespace std;
int data[100][100];
int tempLine[100];
#define MAX(a,b) (a>b?a:b)
int main(){
	int qNum;
	int NowNum = 0;
	int m, n, mi, ni;//m * n
	cin >> qNum;//有qNum个问题
	while (NowNum++<qNum){//NowNum就是Case数
		cin >> m >> n;
		//input
		for (mi = 0; mi < m; ++mi)
			for (ni = 0; ni < n; ++ni)
				scanf("%d",&data[mi][ni]);
		for (ni = 0; ni < n; ++ni){
			if (ni == 0){
				//初始化
				for (mi = 1; mi < m; ++mi)
					data[mi][ni] += data[mi - 1][ni];
				continue;
			}
			for (mi = m - 1; mi >= 0; --mi)
				tempLine[mi] = (mi == m - 1 ? data[mi][ni - 1] : MAX(tempLine[mi + 1], data[mi][ni - 1])) + data[mi][ni];//最后一个等于左侧,其他的是下侧和左侧最大值
			for (mi = 0; mi < m; ++mi)
				data[mi][ni] += (mi == 0 ? data[mi][ni - 1] : MAX(data[mi - 1][ni], data[mi][ni - 1]));//第一个等于左侧,其他的是上侧和左侧最大值
			for (mi = 0; mi < m; ++mi)
				data[mi][ni] = MAX(tempLine[mi], data[mi][ni]);
		}
		printf("Case #%d:\n%d\n", NowNum, data[0][n - 1]);
		//cout << "Case #" << NowNum << ":\n" << data[0][n - 1]<<'\n';
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值