方格取数
题目链接:https://www.luogu.com.cn/problem/P1004
题意:
走两次nxn的方格并取数,求取数的最大值
思路:
四维dp!记f[i,j,x,y]为第一次走到i,j,第二次走到x,y的能获得的和的最大值
不难发现由四种状态转移过来
当i,j,x,y位置相等时,只能加一遍格子上的数
int f[10][10][10][10];
void solve(){
int n;cin>>n;
vector<vector<int>>g(n+5,vector<int>(n+5,0));
int a,b,c;
while(cin>>a>>b>>c){
if(a==b&&b==c&&c==0)break;
g[a][b]=c;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int x=1;x<=n;x++){
for(int y=1;y<=n;y++){
f[i][j][x][y]=max(f[i-1][j][x-1][y],max(f[i][j-1][x-1][y],max(f[i-1][j][x][y-1],f[i][j-1][x][y-1])))+g[i][j]+g[x][y];
if(i==x&&j==y)f[i][j][x][y]-=g[i][j];
}
}
}
}
cout<<f[n][n][n][n]<<endl;
}

浙公网安备 33010602011771号