hdu 2084 数塔(dp ,水)

http://acm.hdu.edu.cn/showproblem.php?pid=2084

从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。
同样,下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。
如数字2,只要选择它下面较大值的结点19前进就可以了。所以实际求解时,可从底层开始,层层递进,最后得到最大值。
 
结论:自顶向下的分析,自底向上的计算。
以上为,hdu,ppt分析。其实就是从上往上的状态转移,先判断下大小,再转移。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
	int C,N,dp[105][105];
	int i,j,ii,jj;
	cin>>C;
	while(C--)
	{
		cin>>N;
		for(i=1;i<=N;i++)
		{
			for(j=1;j<=i;j++)
				cin>>dp[i][j];
		}
		for(ii=i-1;ii>1;ii--)
		{
			for(jj=1;jj<ii;jj++)
			{
				if(dp[ii][jj]>dp[ii][jj+1]) dp[ii-1][jj] +=dp[ii][jj];
				else dp[ii-1][jj]+=dp[ii][jj+1];
			}
		}
		cout<<dp[1][1]<<endl;
	}
	return 0;
}


你可能感兴趣的:(c)