动态规划的基本思想

例题数字三角形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

猜你喜欢

转载自blog.csdn.net/zjsru_Beginner/article/details/119977238
今日推荐