OJ题目:click here~~
百度之星1004
题目分析:给出每条路径的长度,求从(1,1)到(1,m)的最远路径。只能向上,向下或者向右 , 且不重复。
const int maxn = 108 ;
int g[maxn][maxn] ;
int dp[maxn][maxn] ;
int n , m ;
void checkmax(int &a , int b){
if(a < b) a = b ;
}
int main(){
//freopen("in.txt" , "r" , stdin) ;
int t , i , j , k , x , y , T = 1;
cin >> t ;
while(t--){
scanf("%d%d",&n ,&m) ;
memset(dp , -63 , sizeof(dp)) ;
for(i = 1;i <= n;i++)
for(j = 1;j <= m;j++)
scanf("%d",&g[i][j]) ;
dp[0][1] = 0 ;
for(i = 1;i <= n;i++)
dp[i][1] = dp[i - 1][1] + g[i][1] ;
for(j = 2;j <= m;j++){
for(i = 1;i <= n;i++){
x = y = dp[i][j - 1] + g[i][j] ;
checkmax(dp[i][j] , x) ;
for(k = i - 1;k >= 1;k--){
x += g[k][j] ;
checkmax(dp[k][j] , x) ;
}
for(k = i + 1;k <= n;k++){
y += g[k][j] ;
checkmax(dp[k][j] , y) ;
}
}
}
printf("Case #%d:\n%d\n", T++ , dp[1][m]) ;
}
return 0 ;
}