Labyrinth
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2911 Accepted Submission(s): 1007
/* ***********************************************
Author :小蔡虎
Created Time :2014/5/
File Name :E:\2014ACM\HDU\百度之星\資格賽1004
************************************************ */
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#define max(a,b) a>b? a:b
#define PI 3.141592654
#define MA 105
#define inf 9999999
using namespace std;
/*
*/
int a[MA][MA];
int dp1[MA][MA];
int dp2[MA][MA];
int dp[MA][MA],n,m;
void solve()
{
int i,j;
for(i=0; i<m; i++)
dp[i][0]=-inf;
dp[0][0]=a[0][0];
for(j=0; j<n; j++)
{
//更新往下走或左往右的最值:
dp1[0][j]=dp[0][j];//第一行只能左往右走;
for(i=1; i<m; i++)
{
dp1[i][j]=max(dp[i][j],dp1[i-1][j]+a[i][j]);//選擇左→→右或上↓下,取其優;
}
//更新從下往上走或左往右走的最值:
dp2[m-1][j]=dp[m-1][j];//最後一行只能往上走;
for(i=m-2; i>=0; i--)
{
dp2[i][j]=max(dp[i][j],dp2[i+1][j]+a[i][j]);//選擇→或↑,取其優;
}
//更新此列最終狀態和確定下一列初始狀態:
for(i=0; i<m; i++)
{
dp[i][j]=max(dp1[i][j],dp2[i][j]);//從dp1和dp2中選擇最優的;
dp[i][j+1]=dp[i][j]+a[i][j+1];//確定下一列的初始值;
}
}
printf("%d\n",dp[0][n-1]);
}
void input()
{
int i,j;
scanf("%d%d",&m,&n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d",&a[i][j]);
}
int main()
{
int T,k=1;
scanf("%d",&T);
while(T--)
{
printf("Case #%d:\n",k++);
input();
solve();
//output();
}
return 0;
}