44-最大差值三角形

                  最大差值数字三角形 (20分)
题目内容:
给定一个由n行数字组成的数字直角三角形,每行多一个元素:
a
b c
d e f
试设计一个算法,计算出从三角形的顶到底的一条路径,使该路径经过的数字差距最大。
计算路径时,上一行的一个元素只与下一行正下方的元素,或者其右的元素相连。如a与bc,b与de, c与ef.

最大数字差: 一个路径经过(2,1,2,3,7),则最大数字差是7-1=6
输入描述:
第1行输入行数n(n<100)
下面的n行构成数字三角形,第2行一个整数,以后每一行比上一行多一个整数。

输出描述:
最大的路径数字差.

输入样例:
5
2
1 3
2 4 5
6 3 6 8
3 7 5 4 2

输出样例
6

思路:结构体+dp

#include <iostream>
using namespace std;
typedef struct{
	int mi;
	int ma;
}Node;
int n;
Node a[105][105];
Node dp[105][105];

Node f(int x, int y){
	if(x == n){
		return dp[x][y] = a[x][y];
	}	
	if(x < 1 || x > n || y < 1 || y > x + 1)
		return a[0][0];
	int d1, d2;
	Node s1, s2, s;
	s = a[x][y];
	s1 = f(x + 1, y); s2 = f(x + 1, y + 1);
	d1 = max(s1.ma, s.ma) - min(s1.mi, s.mi);
	d2 = max(s2.ma, s.ma) - min(s2.mi, s.mi);
	if(d1 < d2){
		dp[x][y].mi = min(s2.mi, s.mi);
		dp[x][y].ma = max(s2.ma, s.ma);
		return dp[x][y];
	}
	else{
		dp[x][y].mi = min(s1.mi, s.mi);
		dp[x][y].ma = max(s1.ma, s.ma);
		return dp[x][y];
	}
}

int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= i; j++){
			cin >> a[i][j].mi;
			a[i][j].ma = a[i][j].mi;
		}
	}
	f(1, 1);
	cout << dp[1][1].ma - dp[1][1].mi << endl;
	//for(int i = 1; i <= n; i++){
	//	for(int j = 1; j <= i; j++){
	//		cout << dp[i][j].ma << " " << dp[i][j].mi << ";  ";
	//	}
	//	cout << endl;
	//}	
	return 0;
}

  

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7919935.html