洛谷P1006 傳紙條
阿新 • • 發佈:2018-12-13
題目連結
解題思路:
多維動態規劃(不是兩個起點的dfs),可以看做從相同地點到相同終點的兩條不相交的路徑。注意到兩個人傳的紙條經歷的總路徑相等。設為兩人從同一起點傳的路徑到達和的總的值。有成立,當時,成立則兩者不相交。且有:
成立。
#include<iostream>
#include<cstdio>
using namespace std;
int a[55][55],f[55][55][55][55];
//f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],
//f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l]
int _max(int a,int b,int c,int d){
return max(max(max(a,b),c),d);
}
int main(int argc, char** argv) {
int m,n;
scanf("%d%d",&m,& n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=m;i++) {//i+j=k+l
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++){
int l=i+j-k;
if(l<1) continue;
f[i][j][k][l]=_max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];
if(i==k&&j==l)
f[i][j][k][l]-=a[i][j];
}
}
}
printf("%d\n",f[m][n-1][m-1][n]);
return 0;
}