数塔(DP入门) HDU-2084

题目链接

在这里插入图片描述
在这里插入图片描述

这是一个基础的DP问题,我们要想知道第一个结点往下走的时候是往左走还是往右走,就要判断是从左结点走经过的结点数字总数较大还是往右结点走经过的结点数字总数较大,而对于左结点,是往左结点走经过的结点数字总数较大还是往右结点走经过的结点数字总数较大,对于左结点的左结点…你懂的,这个时候就开始循环了。
就这样一直循环到倒数第二层,对于这个结点,是往左节点走好还是往右节点走好,那好办啊,直接比较这个结点的左孩子大还是又孩子大不就结了,把大的孩子数字直接加到这个节点上就得到经过这个结点的最大结点数字总数了,哈哈,这样就好办了,我们就可以逐层求上面的各个节点的最大结点总数了,一直到第一层A[1][1]的值就是经过的结点的数字之和最大是多少。
存储这个数塔我们使用二位数组,而对于任意一个结点,左孩子是dp[i+1][j]或者dp[i+1][j+1],这是我们就要判断它的经过它左孩子得到的最大结点数更大还是右孩子经过的最大结点数更大一点。必须从倒数第二层到第一层逐层判断,这样才能保证孩子中存储的是经过它的最大结点数总数,而不是它自己的结点数。
数组的一层更新完这层存储的数字就是经过该结点的最大结点总数。
#include<bits/stdc++.h>
using namespace std;
int q[105][105];
int main()
{
	int c;
	cin>>c;
	while(c--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=i;j++)
			cin>>q[i][j];
		}
		for(int i=n-1;i>0;i--)
		{
			for(int j=1;j<=i;j++)
			{
				q[i][j]+=max(q[i+1][j],q[i+1][j+1]);
			}
		}
		cout<<q[1][1]<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值