例题数字三角形POJ1163
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的数字三角形▶️中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下↙️或右下↘️走。只需求出这个最大和即可,不必给出具体路径。
三角形的行数大于1小于等于100,数字为0~99
输入格式:
5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和
解题思路
用二维数组存放数字三角形。用递归方法求解。
代码
#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];
int MaxSum(int i,int j)
{
if(maxSum[i][j] != -1 )
return maxSum[i][j];
if(i == n)
maxSum[i][j] = D[i][j];
else{
int x = MaxSum(i+1,j);
int y = MaxSum(i+1,j+1);
maxSum[i][j] = max(x,y) + D[i][j];
}
return maxSum[i][j];
}
int main()
{
int i, j;
cin >> n;
for(i=1; i <= n; i++)
for(j=1; j <= i; j++)
{
cin >> D[i][j];
maxSum[i][j] = -1;
}
cout << MaxSum(1,1) << endl;
}
当然,也可以不用maxSum数组。用指针
int * maxSum
直接用D的第n行替代maxSum
maxSum = D[n];
maxSum[j] = max(maxSum[j],maxSum[j+1]) + D[i][j];
来实现空间优化。
计算机 田xl