方格取数
解法
考虑使用三维动态规划,使用最基础的动态规划跑两遍明显过不了。首先我们要解决一个问题:如何避免一个格子被拿两遍?我们可以同时遍历两个路径。我们设第一条路径目前的横坐标为
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,dp[110][110][110],mp[1100][1100];
signed main(){
ios::sync_with_stdio(false);
cin>>n;
while(true){
int x,y,num;
cin>>x>>y>>num;
if(x==0&&y==0&&num==0){
break;
}else{
mp[x][y]=num;
}
}
for(int i=2;i<=n*2;i++){
for(int j=max(i-n,1ll);j<=min(n,i-1);j++){
for(int k=max(i-n,1ll);k<=min(n,i-1);k++){
dp[i][j][k]=max(max(max(dp[i-1][j][k],dp[i-1][j-1][k-1]),dp[i-1][j][k-1]),dp[i-1][j-1][k]);
dp[i][j][k]+=mp[j][i-j];
if(j!=k){
dp[i][j][k]+=mp[k][i-k];
}
}
}
}
cout<<dp[n*2][n][n];
return 0;
}