动态规划之三角形问题
题目:
在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。三角形的行数大于1小于等于100,数字为 0 - 99。
输入格式:
5 //表示三角形的行数 接下来输入三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和。
思路:
MaxSum(i,j):从第i行j列到底边的最大数字之和
从最后一行开始递推,MaxSum(n,j)=D(n,j)//n行j列,MaxSum(n-1,j) = D(n-1,j) + max( MaxSum(n,j) , MaxSum(n,j+1) )
然后为了减少空间,不需要用二维数组来存储MaxSum(n,j)的值,只需要求MaxSum(n,j)的时候存储下一行MaxSum(n+1,j)的值就可以,然后计算完第n行的MaxSum之后再覆盖原来的第n+1行的MaxSum的值。
代码:
#include
#include
using namespace std;
#define MAX 101
int main(){
int n;//表示三角形的行数
int D[MAX][MAX];
int *MaxSum;//指向一维数组
int y=0;
cin>>n;
for (int i = 0; i < n;i++)
{
for (int j = 0; j <= i; j++)
{
cin>>D[i][j];
}
}
MaxSum=D[n-1];//用二维数组的最后一行来存MaxSum的值;MaxSum(n-1,i)=D[n-1][i];
for (int i = n-2; i >=0; i–)
{
for (int j = 0; j <=i; j++)
{
MaxSum[j]=D[i][j]+max(MaxSum[j],MaxSum[j+1]);
}
}
cout<<MaxSum[0]<<endl;
system("pause");
return 0;
}
测试: