专题三 第一题

来源:互联网 发布:网络象棋 编辑:程序博客网 时间:2024/05/16 17:54

1.题目编号:1006

2.简单题意:将数塔从顶层走到底层,每步只能走相邻的结点,求经过的结点的数字之和最大是多少。

3.解题思路形成过程:在周天的时候刚刚学了动态规划,而且老师讲的一个题和这个特别像~最主要的是建立一个递推公式,通过观察,从最下层开始将最大的找出来逐层向上加就能够得到数字最大值和,公式为:F[i][j]=a[i][j]+max(F[i+1][j],F[i+1][j+1].

4.感悟:刚开始学,感觉有那么点想法往动态规划上靠拢,加油~

5.AC的代码:

#include<iostream>
using namespace std;
const int M=1000+5;
int f[M][M],a[M][M];
inline int max(int x,int y)
{  return x<y?y:x; }
int main(){
     int i,j,n,c;
     cin>>c;
     while(c--){
         cin>>n;
         for(i=1;i<=n;i++)
          for(j=1;j<=i;j++)
             cin>>a[i][j];
         for(j=1;j<=n;j++)
          f[n][j]=a[n][j];
         for(i=n-1;i>=1;i--)
            for(j=1;j<=i;j++)
                f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1]);
        cout<<f[1][1]<<endl;
     }
     return 0;
}

Problem Description


在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:<br><br>有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?<br><img src=../data/images/2084-1.jpg><br>已经告诉你了,这是个DP的题目,你能AC吗?


 


Input


输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。<br>


 


Output


对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。<br>


 


Sample Input


1573 88 1 0 2 7 4 44 5 2 6 5


 


Sample Output


30

0 0