蓝桥杯算法训练 数字三角形C++

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T312

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

思路:

一开始写错了,写的是从顶至底,每次选择两个底数中较大者累加。发现错误之后再就想到列举所有情况的和再取最大值,然鹅这运算量也太大了,运行时间也会超的。没思路只好百度一下咯,艾西我怎么没想到从底至顶,之前的错误代码都不用怎么修改,换个思路就柳暗花明又一村了…所以说脑子是个好东西,可惜我没有啊…

具体解法如下:
从倒数第二行开始,将每个数与其左右两个底数中的较大值相加,同理再倒数第三行第四行…最后最顶层的值就是总和最大值。
在这里插入图片描述
注意:

  1. 二维数组,方便检索行和列 ( j<=i下三角
  2. 取两数中的最大值可直接用max(a,b)
  3. 脑子是个好东西,可惜我没有啊…

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int num[100][100]={0};
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<=i;j++)
			cin>>num[i][j];		
	for(int i=n-2;i>=0;i--)
		for(int j=0;j<=i;j++)
			num[i][j]+=max(num[i+1][j],num[i+1][j+1]);
	cout<<num[0][0]<<endl;	 
	return 0;
}

手动分界线

后来看书更详细的归纳了一下:动态规划初步 数字三角形
https://blog.csdn.net/weixin_42324771/article/details/87275467

手动分界线

以下请无视:(最开始的错代码)
从顶至底每次选择两个底数中较大者累加:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int num[100][100]={0};
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<=i;j++)
			cin>>num[i][j];		
	for(int i=n-2;i>=0;i--)
		for(int j=0;j<=i;j++)
		{
			if(num[i+1][j]>num[i+1][j+1])
			{
				sum+=num[i+1][j];
				i+=1;
			}
			else 
			{
				sum+=num[i+1][j+1];
				i+=1;j+=1;
			}
		}	
	cout<<sum<<endl;	 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42324771/article/details/87023413