蓝桥杯2020年第十一届省赛真题-数字三角形

博客介绍了如何使用动态规划求解三角形中从顶部到底部的最大路径和,同时考虑了路径步数的限制,即向左下走的次数与向右下走的次数相差不超过1。通过状态转移方程和计数数组实现算法,并最终输出满足条件的最大路径和。

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

动态规划!!

首先用dp数组存一下三角形:

for(int i=1;i<=n;i++)
	for(int j=1;j<=i;j++)
	    cin>>dp[i][j];

1. 题目要求的是 只能选择左边或右边,找出一条所有数字和最大的路径。

那么状态转移方程便是当前一层的值加上上一层左边或右边的最大值的那个值,代码如下所示。

	for(int i=1;i<=n;i++)
	    for(int j=1;j<=i;j++)
		    dp[i][j]+=max(dp[i-1][j-1],dp[i-1][j]); 
	

2.题目要求向左下走的次数与向右下走的次数相差不能超过 1。

(无论怎么走,最后一层的结果永远都会有向左下走的次数与向右下走的次数相差不能超过 1的,试想一下从 三角形的顶部 走到 三角形底边 靠近中点的那个点 的 路径)

于是这样想的话,就可以直接计数他是怎么走的,用c数组记录。【注意三角形顶点不需要左右走的计数!!】

	for(int i=2;i<=n;i++)
	    for(int j=1;j<=i;j++){
		    dp[i][j]+=max(dp[i-1][j-1],dp[i-1][j]); 
		    if(dp[i-1][j-1]>dp[i-1][j])c[i][j]=c[i-1][j-1]-1;
		    else if (dp[i-1][j-1]<=dp[i-1][j])c[i][j]=c[i-1][j]+1;	
	    }

3.按题目要求输出答案

    long long maxx=0;
	for(int i=1;i<=n;i++){
		if(abs(c[n][i])<=1)
		maxx=max(dp[n][i],maxx);	
	}
	cout<<maxx;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值