数字三角形问题

数字三角形问题

Description
给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。
Input
输入数据的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0…99之间。
Output
输出数据只有一个整数,表示计算出的最大值。
Samples
Sample #1
Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Output
30

分析:

贪心算法,
主要思路:
//构造出来二维数组存储三角形
//7
//3 8
//8 1 0
//2 7 4 4
//4 5 2 6 5
//可到达每个元素a[i][j]的路径只能为a[i-1][j-1]和a[i-1][j] ,选取其中的较大值进行相加并存储在a[i][j],之后比较最后一行的最大值即可。
或者从下往上遍历,最后输出a[1][1]也可。

第一种:

#include 
using namespace std;
#define INF 9999

int main(){
	int a[110][110]={0};
	int b[110][110];
	int n,sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=i;j++)
		cin>>a[i][j];
		int j=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++)
		   a[i][j]+=max(a[i-1][j-1],a[i-1][j]);
	}
	for(int i=1;i<=n;i++)
	   sum=max(sum,a[n][i]);
	   cout<<sum<<endl;
	return 0; 
}

第二种:

#include 
using namespace std;
#define INF 9999

int main(){
	int a[110][110]={0};
	int b[110][110];
	int n,sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=i;j++)
		cin>>a[i][j];
		int j=1;
	for(int i=n;i>=1;i--){
		for(int j=1;j<=i;j++)
		   a[i][j]+=max(a[i+1][j+1],a[i+1][j]);
	}
	   cout<<a[1][1]<<endl;
	return 0; 
}

你可能感兴趣的:(题解,算法,c++,贪心算法)