hdu 2084 数塔

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

这是一道很简单的DP题 ,我觉得就是一种思想,从后面往前面每次找和最大的,把每个数更新,一直往上推就可以了。。。

我用了两种方法,一种的递归,一种递推

递推代码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int a[100][100];

void dp(int n)

{

    for(int i=n-1;i>=0;--i)

    {

            for(int j=i;j>0;--j)

            {

                   if(a[i][j]+a[i-1][j-1]<a[i-1][j-1]+a[i][j-1])

                   a[i-1][j-1]=a[i-1][j-1]+a[i][j-1];

                   else

                   a[i-1][j-1]=a[i][j]+a[i-1][j-1];

                   //printf("%d  ",a[i-1][j-1]);

            } 

            //printf("\n");

    }   

}

int main()

{

    int t,m;

    scanf("%d",&t);

    while(t--)

    {

              scanf("%d",&m);

              for(int i=0;i<m;++i)

              for(int j=0;j<=i;++j)

              scanf("%d",&a[i][j]);

              dp(m);

              printf("%d\n",a[0][0]);

    }

    system("pause");

    return 0;

}

递归代码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int a[102][102];

void dp(int n)

{

     if(n==0)  return ;

     for(int j=n;j>=0;--j)

     {

             if(a[n][j]+a[n-1][j-1]<a[n-1][j-1]+a[n][j-1])

                   a[n-1][j-1]=a[n-1][j-1]+a[n][j-1];

                   else

                   a[n-1][j-1]=a[n][j]+a[n-1][j-1];

     }

     dp(n-1);

}

int main()

{

    int t,m;

    scanf("%d",&t);

    while(t--)

    {

              scanf("%d",&m);

              for(int i=0;i<m;++i)

              for(int j=0;j<=i;++j)

              scanf("%d",&a[i][j]);

              dp(m);

              printf("%d\n",a[0][0]);

              

    }

    system("pause");

    return 0;

}

posted @ 2011-08-02 22:15  ○o尐懶錨o  阅读(713)  评论(0编辑  收藏  举报