程序设计与算法(二)
算法基础
1
2
动态规划(一)
例题
数字三角形
加拿大班芙国家公园
例题一、数字三角形(POJ1163)
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的数字三角形中寻找一条从顶部到底边的路径,使得
路径上所经过的数字之和最大。路径上的每一步都只能往左下或
右下走。只需要求出这个最大和即可,不必给出具体路径。
三角形的行数大于1小于等于100,数字为 0 - 99
5
输入格式:
5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和
6
解题思路:
用二维数组存放数字三角形。
D( r, j) : 第r行第 j 个数字(r,j从 1开始算)
MaxSum(r, j) : 从D(r,j)到底边的各条路径中,
最佳路径的数字之和。
问题:求 MaxSum(1,1)
典型的递归问题。
D(r, j)出发,下一步只能走D(r+1,j)或者D(r+1, j+1)。故对于N行的三角形:
if ( r == N)
MaxSum (r,j) = D(r,j)
else
MaxSum ( r, j) = Max{ MaxSum (r+1,j), MaxSum (r+1,j+1) }
+ D(r,j) 7
数字三角形的递归程序:
#include
#include
#define MAX 101
using namespace std;
int D[MAX][MAX];
int main(){
int n;
int i,j;
int MaxSum(int i, int j){ cin >> n;
if(i==n) for(i=1;i<=n;i++)
return D[i][j]; for(j=1;j<=i;j++)
int x = MaxSum(i+1,j); cin >> D[i][j];
cout << MaxSum(1,1) << endl;
int y = MaxSum(i+1,j+1);
}
return max(x,y)+D[i][j];
}
8
为什么超时?
7