HDU 2084数塔【dp入门】

HDU 2084数塔

 

Problem 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

//从0 ~ n-1 行
#include<iostream>
#include<string.h> 
using namespace std;
int a[105][105];//储存数塔 
int d[105][105];//从该点到底端的最大数字和 
int i,j,n;
 
int dp(int i,int j)
{
	if(d[i][j]>=0)
		return d[i][j];
	else
		{
		d[i][j]=a[i][j]+(i==n?0:max(dp(i+1,j),dp(i+1,j+1)));
		return d[i][j];
		}
}	
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n;
		memset(d,-1,sizeof(d));
		for(i=0;i<n;i++)
			for(j=0;j<=i;j++)
			{
				cin>>a[i][j];
			}
		cout<<dp(0,0)<<endl;
//		后期测试整个d数组 
//		dp(0,0);
//		for(int i=0;i<n;i++)
//		{
//			for(int j=0;j<=i;j++)
//			{
//				cout<<d[i][j]<<" ";
//			}
//			cout<<endl;
//		}

	}
	return 0;
}

样例 数塔 

7        
3 8      
8 1 0    
2 7 4 4  
4 5 2 6 5

数组d

30        
23 21      
20 13 10    
7 12 10 10  
4 5 2 5

猜你喜欢

转载自blog.csdn.net/tingtingyuan/article/details/81482354
今日推荐