当前位置:   article > 正文

【C++】数字三角形(动态规划/递归/递推)_数字三角形c++编程

数字三角形c++编程

Description

下图中给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。 注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。
在这里插入图片描述

Input

输入有多组测试数据,输入以EOF为结束,对于每一组测试数据,输入的第一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。

Ouput

对于每一组测试数据输出一行,先输出Triangle #i:,i从1开始,然后输出最大和的值。

Sample Input

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

Sample Output

Triangle #1: 30
  • 1

动态规划/递归

解题思路

在这里插入图片描述

代码图解

一开始

cin>>D[i][j];
maxSum[i][j] = -1;

在这里插入图片描述

x = fun(i+1,j); y = fun(i+1,j+1);
maxSum[i][j] = max(x,y)+D[i][j];

在这里插入图片描述

if(i==n)
maxSum[i][j] = D[i][j];

在这里插入图片描述

代码实现

#include<iostream>
#include<algorithm>
using namespace std;
int n;
int D[100][100];
int maxSum[100][100];
int id=1;
int fun(int i,int j){
	int x,y;
	if(maxSum[i][j]!=-1)//如果之前有计算过,直接取记录好的数,避免进行多次计算 
	return maxSum[i][j];
	
	if(i==n) //如果i到数组的底部最后一行,那么最大和就是它本身那个数 
	maxSum[i][j]=D[i][j];
	else{
		x = fun(i+1,j);
		y = fun(i+1,j+1);
		maxSum[i][j] = max(x,y)+ D[i][j];
	}
	return maxSum[i][j];
}
int main(){
	int i,j;
	while(cin>>n){
		for(i=0;i<n;i++){
			for(j=0;j<i+1;j++){
				cin>>D[i][j];
				maxSum[i][j]=-1;//标记每个数的最大值为-1 
			}
		}
		cout<<"Triangle #"<<id++<<": "<<fun(0,0)<<endl; 
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

递归变递推

代码图解

for(i=1;i<=n;i++)
maxSum[n][i] = D[n][i];

在这里插入图片描述
然后双重循环填充数组,一层层往上走
在这里插入图片描述

代码实现

为了便于理解,此处代码的数组下标从1开始

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int n;
int D[MAX][MAX];
int maxSum[MAX][MAX];
int id=1;
int main(){
	int i,j;
	while(cin>>n){
		for(i=1;i<=n;i++){
			for(j=1;j<=i;j++){
				cin>>D[i][j]; 
			}
		}
		for(i=1;i<=n;i++)//先填充数字三角形最后一行 
		maxSum[n][i] = D[n][i];
		
		for(i=n-1;i>=1;i--){
			for(j=1;j<=i;j++){
				maxSum[i][j] = max(maxSum[i+1][j],maxSum[i+1][j+1])+D[i][j];
			}
		}
		
		cout<<"Triangle #"<<id++<<": "<<maxSum[1][1]<<endl; 
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/487800
推荐阅读
相关标签
  

闽ICP备14008679号