hdu 2084 数塔

解题分析:
此题采用动态规划从自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后排数其中一个,向上退,倒数第二步肯定走最后排数对应的倒数第二排最大的一个(将最后对应最后步走的最大的数加起来存在倒数第二步的数组中:不理解的话先看思路在看程序),再向上推,一直推到最上面的第0步,那么num[0][0]最后所存的结果一定是最大的;
 
#include<stdio.h>
#include<string.h>
int num[110][110];
int dp(int m)
{
    int i=m-1,j;
    for(;i>0;i--)
    for(j=i;j>=0;j--)
    if(num[i][j]+num[i-1][j-1]>num[i][j-1]+num[i-1][j-1])
    num[i-1][j-1]=num[i][j]+num[i-1][j-1];
    else num[i-1][j-1]=num[i-1][j-1]+num[i][j-1];
    return 0;
}
int main()
{
    
    int n,m,i,j;
    scanf("%d",&n);
    while(n--)
    {
        memset(num,0,sizeof(num));
        scanf("%d",&m);
        for(i=0;i<m;i++)
        for(j=0;j<=i;j++)
        scanf("%d",&num[i][j]);
        dp(m);
        printf("%d\n",num[0][0]);
    }
    return 0;
} 

你可能感兴趣的:(dp)