解题思考(DP数塔问题)A. 数塔

题目描述

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

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

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

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

输入样例

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

输出样例

30

 思考:数塔问题,从下至上的解决思路,从最底层求每一个最大的小数塔,求到最后到最顶层的数即为所求的最大值。

思路同时可理解为构建一个新的数值数塔。(如下图)

1                                    8  

2        3                          3        7

2        1        4                2        1        4

#include<bits/stdc++.h>
using	namespace	std;
int	decide(int	a,int	b);//返回最大值 
int	main()
{
	int	N;
	cin>>N;
	while(N--)
	{
		int	n;
		cin>>n;
		long	long	arr[n][n];
		int	j=1;
		for(int	i=0;i<n;i++)
		{
			for(int	k=0;k<j;k++)
				cin>>arr[i][k];
			j++;
		}
		j=n-2; 
		for(int	i=n-2;i>=0;i--)
		{
			for(int	k=0;k<=j;k++)
				arr[i][k]=arr[i][k]+decide(arr[i+1][k],arr[i+1][k+1]);
			j--;
		} 
		cout<<arr[0][0]<<endl;
	}
}
int	decide(int	a,int	b)
{
	if(a>=b)
		return	a;
	else
		return	b;
}

上一篇:获取项目中的全部icon


下一篇:避免大量ifelse(枚举、工厂模式、策略模式)