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

来源:互联网 发布:mixer sam 软件 编辑:程序博客网 时间:2024/04/30 01:09
/* *问题描述:数字三角形问题(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; }

运行结果:


0 0
原创粉丝点击