tyvj1011 - 传纸条 ——DP

题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1011

状态转移方程:

f[k,x1,x2] = max(f[k-1,x1,x2],f[k-1,x1-1,x2],f[k-1,x1-1,x2-1],f[k-1,x1,x2-1]) + a[y1,x1] + a[y2,x2];

f[k,x1,x2]表示,第K步的时候,一条路的横坐标是x1,另一条路的横坐标是x2的时候所得到的最优解。另外,还要考虑一下,当x1==x2的时候的情况,这个时候,只能允许一条路走到那个位置。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 int a[51][51],f[100][51][51];
 7 int main(void) {
 8     freopen("in1.txt","r",stdin);
 9     int N,M; scanf("%d%d", &M, &N);for(int i=1;i<=M;++i)for(int j=1;j<=N;++j)scanf("%d",&a[i][j]);
10     for(int k=1;k<=M+N-3;++k)for(int x1=1;x1<=min(N,k+1);++x1)for(int x2=1;x2<=min(N,k+1);++x2) {
11         f[k][x1][x2]=max(max(f[k-1][x1][x2],f[k-1][x1-1][x2]),max(f[k-1][x1][x2-1],f[k-1][x1-1][x2-1]));
12         if (x1==x2)f[k][x1][x2]+=a[k-x1+2][x1]; else f[k][x1][x2]+=(a[k-x1+2][x1]+a[k-x2+2][x2]);
13     } printf("%d\n",f[M+N-3][N][N-1]);
14     return 0;
15 }

昨天看了一篇文章,才发现,其实,题解是写给自己看的-_-#

posted on 2013-07-07 11:32  aries__liu  阅读(402)  评论(0编辑  收藏  举报