标签:style blog color os io for div log amp
数字三角形的扩展,数字矩形*2路径
假设两个指条同时出发,同一时刻,两指条必定在同一条从左下到又上的对角线上k,假定指条1出发时向下,2向上,则指条1所在的行又必定在指条2所在行的下面,所以
设dp[k][i][j]表示两指条走到k对角线时,1在i行,2在j行所得到的最大分数,
则有
|max(dp[k-1][i][j],max(dp[k-1][i][j-1],dp[k-1][i-1][j-1])); i和j为相邻行
dp[k][i][j] = |
|max(dp[k-1][i-1][j],max(dp[k-1][i][j],max(dp[k-1][i][j-1],dp[k-1][i-1][j-1])));i和j不相邻
然后还要加上此状态下两指条得到的分数
dp[k][i][j]+=(a[i][k-i],a[j][k-j])
DP目标dp[n+m-1][n][n-1]
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 55; 7 int a[maxn][maxn],dp[maxn+maxn][maxn][maxn]; 8 int main() 9 { 10 //freopen("in.txt","r",stdin); 11 int n,m; 12 while(cin>>n>>m) 13 { 14 for(int i = 1;i<=n;++i) 15 for(int j = 1;j<=m;++j) 16 scanf("%d",&a[i][j]); 17 memset(dp,0,sizeof(dp)); 18 for(int k = 3;k<=n+m-1;++k) 19 for(int i = k-1;i>1;--i) 20 for(int j = i-1;j>0;--j) 21 { 22 if(i-1==j)dp[k][i][j] = max(dp[k-1][i][j],max(dp[k-1][i][j-1],dp[k-1][i-1][j-1])); 23 dp[k][i][j] = max(dp[k-1][i-1][j],max(dp[k-1][i][j],max(dp[k-1][i][j-1],dp[k-1][i-1][j-1]))); 24 dp[k][i][j] = dp[k][i][j] + a[i][k-i] + a[j][k-j]; 25 } 26 printf("%d\n",dp[n+m-1][n][n-1]); 27 } 28 return 0; 29 }
标签:style blog color os io for div log amp
原文地址:http://www.cnblogs.com/GJKACAC/p/3933728.html