动态规划,对于每列,分别从上到下,从下到上,计算两种情况产生的最大值,然后取最大值。
#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';
}
}