HDUOJ----数塔

数塔Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 5 Accepted Submission(s) : 4Problem Description

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

已经告诉你了,这是个DP的题目,你能AC吗?

Input

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

Output

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

Sample Input

1

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

Sample Output

30

Source

2006/1/15 ACM程序设计期末考试

金典的动态规划...采用回嗍发....

•DP解法:

一:设计 dp[i][j] 为第 i 行第 j 列走到最底层的数字最大和

二:状态转移:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j]

a[i][j] 为第i行j列的数字

初始状态dp[n][j] = a[n][j]

代码:

代码语言:javascript代码运行次数:0运行复制 1 #include

2 #include

3 #define maxn 103

4 using namespace std;

5 int arr[maxn][maxn],dp[maxn][maxn];

6 int max(int a,int b)

7 {

8 return a>b?a:b;

9 }

10 int main()

11 {

12 int n,i,j,t,largest;

13 cin>>t;

14 while(t--)

15 {

16 memset(dp,0,sizeof dp);

17 cin>>n;

18 for(i=0;i

19 {

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

21 {

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

23 dp[i][j]=arr[i][j]; //初始化

24 }

25 }

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

27 {

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

29 {

30 dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+arr[i][j];

31 }

32 }

33 cout<

34 }

35 return 0;

36 }

手机护眼软件护眼app排行榜TOP10推荐
Photoshop教程:轻松实现3D立体字效果的制作方法