Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1114 Accepted Submission(s): 477
#include <stdio.h>
#define INF 100000
#define MAX(a,b) a>b?a:b
#define REP(i,x,y) for(int i=x;i<y;i++)
#define REP1(i,x,y) for(int i=x;i>=y;i--)
int maze[101][101],d[101],d1[101],d2[101];
void Input(int m,int n){
REP(i,0,m)
REP(j,0,n) scanf("%d",&maze[i][j]);
}
void Hunt(int m,int n){
//init
d[0]=maze[0][0];
REP(i,1,m) d[i]=d[i-1]+maze[i][0];
REP(j,1,n){
//从上往下扫描
d1[0]=d[0]+maze[0][j];
REP(i,1,m){
//这两行代码不能合为一句,否则返回的只是MAX的值
d1[i]=MAX(d[i],d1[i-1]);
d1[i]+=maze[i][j];
}
//从下往上扫描
if(m>1){
d2[m-1]=d[m-1]+maze[m-1][j];
REP1(i,m-2,0){
d2[i]=MAX(d[i],d2[i+1]);
d2[i]+=maze[i][j];
}
}
else{
REP(i,0,m) d2[i]=-INF;
}
REP(i,0,m) d[i]=MAX(d1[i],d2[i]);
}
}
int main(){
int t,m,n;
scanf("%d",&t);
REP(i,1,t+1){
scanf("%d%d",&m,&n);
Input(m,n);
Hunt(m,n);
printf("Case #%d:\n%d\n",i,d[0]);
}
return 0;
}
原文:http://www.cnblogs.com/520xiuge/p/6506555.html