题意分析
和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;
}
本文介绍了一种基于四维动态规划解决特定问题的方法,重点在于如何通过递推更新状态,实现对同一位置多次访问并确保计数准确无误。文章详细展示了状态转移方程,并附带完整的代码实现。
480

被折叠的 条评论
为什么被折叠?



