P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles

本文介绍了USACO1.5和IOI1994的一道经典问题——数字三角形,讲述了作者如何解决寻找数字三角形中到达底部路径和最小的问题。作者最初尝试贪心策略失败,后来转而采用从底部向上,寻找每个位置最大路径和的方法,最终实现题目要求。

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

P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles

各位巨佬,大家好,你们那打不死的小蒟蒻又来了


题目传送站

今天,小蒟蒻带来一道十分经典的题目——数字三角形
对于目前智商零下的小蒟蒻来说,可是一道非常难的题目,可经过几天的磨练,我终于做出来了😭😭😭

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

根据题意,要从头找一条到底部的路径,使它所经过的数字和最小,本蒟蒻便有了以下几种想法:

  1. 贪心:
    从第一步起,每步都找下面中最大的一个
73   88   1   02   7   4   44   5   2   6   5 

在这里插入图片描述
嗯嗯嗯……样例都没过我bbbb
2. 根据几天的思考,我终于知道了,要从反面思考
从底部开始,i,j这个位置也就是i,j这个位上的数加下面能到达i,j的最大路径
为此附上代码请巨佬勿吐槽

/*
a[][]在这里既是原数组,也是d[][]
   x1(i,j)
 x2(i+1,j)  x3(i+1,j+1)
 d[i][j]=max(d[i+1][j],d[i+1][j+1])+a[i][j]
 即 a[i][j]=max(a[i+1][j],a[i+1][j+1])+a[i][j]
*/
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int a[N][N],n;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			cin>>a[i][j];
		}
	}
	//4   5   2   6   5   最后一层到达它本身的路线就是自己
	for(int i=n-1;i>=1;i--)
	{
	/*
⑤→	        7 
④→	      3   8 
③→	    8   1   0 
②→	  2   7   4   4 
①→	4   5   2   6   5 
	所以第一层for从后往前
	第二层for从前往后
	*/
		for(int j=1;j<=i;j++)
		{
			a[i][j]=max(a[i+1][j],a[i+1][j+1])+a[i][j];
		}
	}
	cout<<a[1][1]<<endl;
	return 0;
}

谢谢各位巨佬的观看byebye

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值