杭电 HDU 2084 数塔

来源:互联网 发布:linux piwik安装详解 编辑:程序博客网 时间:2024/04/25 17:58

http://acm.hdu.edu.cn/showproblem.php?pid=2084

第一次用动规,还是没理解那个状态转移方程怎么写,感觉就是用递归,但是书上说因为递归速度太慢所以用动规。。。

这个题一开始按照书上动规的思路在想状态转移,就是要求最后一个的最大值就要知道前面一个数的最大值。。想了半天没想明白,后来同学给我说不要那样跟着题目思路从
顶层往下走,那样好麻烦的,叫我直接从数塔的最下面开始网上走,就是从最底层网上一层一层求出最大值,最后相加即是结果。。。

好吧,反过来想着也能看成状态转移,只是我们是先已经求出前面的最大值状态,最后直接求结果。。如图所示。。


AC代码:
#include<iostream>#include<cstdio>using namespace std;int main(){    int a[101][101],i,j,t,n;    int sum,max;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i = 0; i < n; i++)        {            for(j = 0; j <= i; j++)            {                scanf("%d",&a[i][j]);            }        }        sum = a[0][0];        for(i = n-2; i >= 0; i--)    //从最下面一层开始求和并把最大值存到当前位置        {            for(j = 0; j <= i; j++)            {                sum = a[i][j] + a[i+1][j];                max = sum;                sum = a[i][j] + a[i+1][j+1];                if(sum > max)                {                    max = sum;                }                a[i][j] = max; //               printf("i:%d j:%d %d\n",i,j,a[i][j]);            }        } //       printf("\n");        printf("%d\n",a[0][0]);    }    return 0;}


原创粉丝点击