1. 程式人生 > >洛谷P1006 傳紙條

洛谷P1006 傳紙條

題目連結
解題思路:

多維動態規劃(不是兩個起點的dfs),可以看做從相同地點到相同終點的兩條不相交的路徑。注意到兩個人傳的紙條經歷的總路徑相等。設f[i][j][k][l]f[i][j][k][l]為兩人從同一起點傳的路徑到達(i,j)(i,j)(k,l)(k,l)的總的值。有i+j=k+li+j=k+l成立,當i==ki==k時,jlj\ne l成立則兩者不相交。且有: f[i][j][k][l]=max(f[i1][j][k1][l],f[i1][j][k][l1],f[i][j1][k1][

l],f[i][j1][k][l1])+a[i][j]+a[k][l]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]成立。

#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; }