多进程DP
现在才知道多进程的是有多么的恶心。。。
做过了1011传纸条,这题就没什么难度了,只要在传纸条上加上一维就行,最恶心的地方在于,这题没有限定走过的不能走,所以,对于每个状态有八个方向可以转移过来。。。。具体看代码吧
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 41; 7 int a[maxn][maxn],dp[maxn+maxn][maxn][maxn][maxn]; 8 int main() 9 { 10 //freopen("in.txt","r",stdin); 11 int n; 12 while(cin>>n) 13 { 14 for(int i = 1;i<=n;++i) 15 for(int j = 1;j<=n;++j) 16 scanf("%d",&a[i][j]); 17 memset(dp,0,sizeof(dp)); 18 dp[2][1][1][1] = a[1][1]; 19 for(int r = 3;r<=n*2;++r) 20 for(int i = 1;i<r;++i) 21 for(int j = 1;j<r;++j) 22 for(int k = 1;k<r;++k) 23 { 24 int t = max(dp[r-1][i][j][k],max(dp[r-1][i][j-1][k],max(dp[r-1][i][j-1][k-1],dp[r-1][i][j][k-1]))); 25 t = max(t,max(dp[r-1][i-1][j][k],max(dp[r-1][i-1][j][k-1],max(dp[r-1][i-1][j-1][k-1],dp[r-1][i-1][j-1][k])))); 26 int t1 = a[i][r-i],t2 = a[j][r-j],t3 = a[k][r-k]; 27 t+=a[i][r-i];a[i][r-i] = 0; 28 t+=a[j][r-j];a[j][r-j] = 0; 29 t+=a[k][r-k];a[k][r-k] = t3; 30 a[i][r-i] = t1;a[j][r-j] = t2; 31 dp[r][i][j][k] = t; 32 } 33 printf("%d\n",dp[n+n][n][n][n]); 34 } 35 36 return 0; 37 }
原文:http://www.cnblogs.com/GJKACAC/p/3933729.html