#555. 数字三角形(3月22日)

这是一个使用动态规划解决的经典编程问题,从数字三角形的顶部开始,目标是找到一条路径,使得路径上所有数字之和最大。解决方案是从上往下计算,通过比较从左节点和右节点到达当前节点的路径和来更新状态。最终得到的f[n][j]即为最大路径和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

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

输入格式

第一行包含整数 nn,表示数字三角形的层数。

接下来 nn行,每行包含若干整数,其中第 ii 行表示数字三角形第 ii 层包含的整数。
输出格式

输出一个整数,表示最大的路径数字和。
样例
输入数据 1

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

输出数据 1

30

数据范围

1≤n≤5001≤n≤500

−10000≤三角形中的整数≤10000−10000≤三角形中的整数≤10000

一道dp题目,应该很经典,第一次做的时候是从下面到上面计算,这次做的时候考虑从上面开始。首先我们考虑处理这个数字三角的斜着的部分,它的走法只有一条,只能从上面来到达。左边斜着的可以得到f[i][1]+=f[i-1][1]+该位置的值,而右边斜着的可以得到f[i]j+=f[i-1][j].但是会存在一个是问题就是f[i-1][j]找不到,其实f[i-1][j]=f[i-1][j-1].剩下的就是中间的部分了:由于f[i][j]可以由f[i-1][j]或着f[i-1][j-1]得到,所以需要判断一下那个加出来最大。
代码为f[i][j]+=max(f[i-1][j-1]+ans[i][j],f[i-1][j]+ans[i][j])。(ans[i][j]为当前位置的值)。
具体代码如下:

#include<iostream>
using namespace std;
int n,ans[505][505];
int f[505][505];
int maxn=-5000001;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			cin>>ans[i][j];
		}
	}
	f[1][1]=ans[1][1];
	f[1][2]=ans[1][1];
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			if(j==1) f[i][1]+=f[i-1][1]+ans[i][j];
			else if(j==i)
			{
				f[i-1][j]=f[i-1][j-1];
				f[i][j]+=f[i-1][j]+ans[i][j];
			 } 
			else
		   f[i][j]+=max(f[i-1][j-1]+ans[i][j],f[i-1][j]+ans[i][j]);	
		}
	}
	for(int j=1;j<=n;j++)
	{
		maxn=max(maxn,f[n][j]);
	}
	cout<<maxn;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值