题意分析
和P1006 差不多。
区别就是如果取走了数字,要归0,而且可以走相同的格子。
状态的定义和传纸条是一样的 。
直接
n4
n
4
的循环,然后就OK了。
注意如果是转移到同一个地方,那么这一个方格子的值只能加一次。
代码总览
#include<bits/stdc++.h>
using namespace std;
const int nmax = 60;
int mp[nmax][nmax];
int dp[nmax][nmax][nmax][nmax];
int n,m;
int getdp(){
for(int i = 1;i<=n;++i){
for(int j = 1;j<=n;++j){
for(int k = 1;k<=n;++k){
for(int l = 1;l<=n;++l){
dp[i][j][k][l] = max(dp[i][j][k][l],dp[i-1][j][k-1][l]);
dp[i][j][k][l] = max(dp[i][j][k][l],dp[i-1][j][k][l-1]);
dp[i][j][k][l] = max(dp[i][j][k][l],dp[i][j-1][k-1][l]);
dp[i][j][k][l] = max(dp[i][j][k][l],dp[i][j-1][k][l-1]);
dp[i][j][k][l] += (i == k && j == l)?mp[i][j]:(mp[i][j] + mp[k][l]);
}
}
}
}
return dp[n][n][n][n];
}
int main(){
scanf("%d",&n);
int a,b,c;
while(scanf("%d %d %d",&a,&b,&c)){
if(a == 0 && b == 0 && c == 0) break;
mp[a][b] = c;
}
printf("%d\n",getdp());
return 0;
}