最大差值数字三角形 (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; }