hdu4791 Labyrinth

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

#include
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++> 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';
	}
}


你可能感兴趣的:(hdu4791 Labyrinth)