HDOJ2084数塔问题

数塔问题

题目要求从顶层走到底层,若每一步只能走到相邻的结点,求经过的结点的数字之和最大值。

很经典的DP,可以这样考虑,要求从塔顶到塔底最大路径之和,计算时可以考虑自底向上,走最后一步所选的数一定是塔底的某个值,向上退一层,对于倒数第二步,所走的是塔底往上一层较大的那个数,此时可以将倒数第二步所走的数与塔底较大的值加起来,记忆存储,依次往上推,一直推到塔顶,此时所计算出的结果一定是最大的。

下面这张图很清晰地反映出了解题的思想。

HDOJ2084数塔问题_第1张图片

 

 

此时可以用方程表示为

Dp[i][j]+=max{dp[i-1][j],dp[i-1][j-1]}

AC代码如下:

#include<iostream>
using namespace std;
int main()
{
	int c,dp[101][101];
	cin>>c;
	while(c--)
	{
		int n,i,j;
		cin>>n;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=i;j++)
			{
				cin>>dp[i][j];
			}
		}
		
		for(i=n-1;i>=1;i--)
		{
			for(j=1;j<=i;j++)
			{
				dp[i][j]+=dp[i+1][j]>dp[i+1][j+1]?dp[i+1][j]:dp[i+1][j+1];
			}
		}
		cout<<dp[1][1]<<endl;
	}
	return 0;
}


 

 

你可能感兴趣的:(HDOJ2084数塔问题)