记忆化搜索。。。。。。
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N, M;
int dp[510][510];
int u[510][510];
int r[510][510];
int DFS( int i, int j ){
if( dp[i][j] != 0 ){
return dp[i][j];
}
if( i == 1 && j == 1 ){
return max( u[i][j], r[i][j] );
}
if( i == 1 ){
return dp[i][j] = max( u[i][j], DFS( i, j - 1 ) + r[i][j] );
}
if( j == 1 ){
return dp[i][j] = max( r[i][j], DFS( i - 1, j ) + u[i][j] );
}
dp[i][j] = max( dp[i][j], DFS( i - 1, j ) + u[i][j] );
dp[i][j] = max( dp[i][j], DFS( i, j - 1 ) + r[i][j] );
return dp[i][j];
}
int main(){
int T, Case = 1;
cin >> T;
while( T-- ){
cin >> N >> M;
memset( dp, 0, sizeof( dp ) );
memset( u, 0, sizeof( u ) );
memset( r, 0, sizeof( r ) );
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= M; j++ ){
int temp;
cin >> temp;
u[i][j] = u[i][j-1] + temp;
r[i][j] = r[i-1][j] + temp;
}
}
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= M; j++ ){
int temp;
cin >> temp;
// u[i][j] = u[i][j-1] + temp;
r[i][j] = r[i-1][j] + temp;
}
}
cout << "Case " << Case++ << ": " << DFS( N, M ) << endl;
}
return 0;
}