hdu 2084

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

本题可以从上往下递推,也可以从下往上递推。

从下往上:

#include <iostream>
using namespace std;
int
main(int argc, char *argv[])
{

   
    int
c,n,data[102][102],inp[102][102];
    cin>>c;
    while
(c--)
    {

       cin>>n;
       memset(data,0,sizeof(data));
       memset(inp,0,sizeof(data));
       for
(int i=1;i<=n;i++)
           for
(int j=1;j<=i;j++)
               cin>>data[i][j];        
       for
(int k=1;k<=n;k++)
         inp[n][k]=data[n][k];
       for
(int i=n-1;i>=1;i--)
            for
(int j=1;j<=i;j++)
             inp[i][j]=data[i][j]+max(inp[i+1][j],inp[i+1][j+1]);      
       cout<<inp[1][1]<<endl;      
             
     }

   
    //system("PAUSE");
    return EXIT_SUCCESS;
}

 

----------------------------------------------------------------------------

从下往上推,也很容易:

#include <iostream>
#include <cstring>
using namespace std;
int data[102][102];//���������������
int inp[102][102];// ������������

int main()
{
   int n;
    while(cin>>n)
    {
     memset(inp,0,sizeof(inp));
     memset(data,0,sizeof(data));
     for(int i=1;i<=n;i++)
          for(int j=1;j<=i;j++)
            {
                  cin>>data[i][j];
                  if (i==1) inp[i][j]=data[i][j];
                  else
              inp[i][j]=max(inp[i-1][j],inp[i-1][j-1])+data[i][j];


            }
int tmp=0;
     for(int k=1;k<=n;k++)
       if (tmp<=inp[n][k]) tmp=inp[n][k];
     cout<<tmp<<endl;


    }

    //cout << "Hello world!" << endl;
    return 0;
}

 

posted @ 2012-10-12 08:32  兴安黑熊  阅读(185)  评论(0编辑  收藏  举报