代码改变世界

动态规划模型3,数塔问题

2013-02-22 09:09  Dr.Ray  阅读(260)  评论(0)    收藏  举报

     掌握了三要素方法这道题还是比较容易的。

     这道题有一点让我比较混乱,就是正推还是倒推的问题,因为没有特殊限制,所以这道题正推倒推都可以得到正确解,无非是把塔给倒转一下,路径上的最大值还是不变的。但是,如果用正推,在推边缘上的项的状态时,就要多出一个判断上面的项是否在塔中的步骤,而倒推的话是从下面的项推上面的项,无此担忧。最后输出顶点的状态就是答案了。

     另外要注意的是在初始化最底层状态时我利用了最底层的下一层的0,在其他题目中这可能会使错误的, 注意验证

 

代码:

#include<stdio.h> #include<stdlib.h> #include<string.h>

int numtri[1001][1001], opt[1001][1001];

int max(int n, int m) {     if(n > m)     return n;     else return m; }

void init() {     memset(numtri, 0, sizeof(numtri));     memset(opt, 0, sizeof(opt)); }

int main() {     int n;     scanf("%d",&n);     init();

    for(int i=1; i<=n; i++)     {         for(int j=1; j<=i; j++)         {             scanf("%d",&numtri[i][j]);         }     }

    //opt[1][1] = numtri[1][1];

    for(int i=n; i>=1; i--)     {         for(int j=1; j<=i; j++)         {             opt[i][j] = max(opt[i+1][j], opt[i+1][j+1]) + numtri[i][j];         }     }

    printf("%d\n",opt[1][1]); }