/*
*问题描述:数字三角形问题(POJ1163)
*/
/*递推法*/

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];
int main()
{
int i,j;
cin>>n;
for (i = 1;i<=n;i++)
for(j = 1;j<=i;j++)
cin>>D[i][j];
for(int i = 1;i<= n;i++)
maxSum[n][i] = D[n][i];
for(i = n-1;i>=1;i--)
for(j =1; j<=i;j++)
maxSum[i][j] = max(maxSum[i+1][j],maxSum[i+1][j+1]) + D[i][j];
cout<<maxSum[1][1] <<endl;
return 0;
}

/*
*空间优化:没有必要用二维数组maxSum来存储每一个MaxSum(i,j)的值。
只要从底层一层层向上递推,那么只要一维数组maxSum[100]即可。
即只要存储最后一行的maxSum的值就可以
*/
/*
*空间优化2:进一步考虑,连maxSum数组都可以不要,直接用D的第n行替代maxSum即可
*/
#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int* maxSum;
int main()
{
int i,j;
cin>>n;
for (i = 1;i<=n;i++)
for(j = 1;j<=i;j++)
cin>>D[i][j];
maxSum = D[n];//用maxSum指向第n行

for(i = n-1;i>=1;i--)
for(j =1; j<=i;j++)
maxSum[j] = max(maxSum[j],maxSum[j+1])+D[i][j];
cout<<maxSum[1] <<endl;
return 0;
}

运行结果:

动态规划——数字三角形问题(空间优化)_ci