动态规划的基本思想

该博客介绍了一种使用动态规划方法解决POJ1163问题的策略,即在给定的数字三角形中找到从顶部到底部的最大路径和。博主通过递归和二维数组的方法实现了这一算法,并探讨了空间优化的可能性,通过直接更新三角形的最后一行以减少空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值