您的位置:首页 > 其它

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

2017-02-28 10:53 337 查看
/*
*问题描述:数字三角形问题(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
[i] = D
[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
;//用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;
}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: