码迷,mamicode.com
首页 > 其他好文 > 详细

TYVJ1011

时间:2014-08-24 23:28:03      阅读:266      评论:0      收藏:0      [点我收藏+]

标签: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 }

 

TYVJ1011

标签:style   blog   color   os   io   for   div   log   amp   

原文地址:http://www.cnblogs.com/GJKACAC/p/3933728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!