POJ-1163(The Triangle)动态规划基础题

该博客介绍了如何解决POJ-1163问题,即找到一个数字三角形中从顶部到底部的最大路径和。问题可以通过动态规划方法解决,从三角形的倒数第二层开始,将每个位置的值更新为它下方两个相邻值中的较大者。最终,当计算到第一层时,得出的最大值即为答案。博主提供了完整代码示例。

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

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30

就是你身处最三角形的顶端,你可以选择向下紧邻两个的左边或右边走,然后求你所走路标的最大总和

这题可以从递归的角度来理解,即要求当前这个的最大值只要知道左边的最大值和右边的最大值哪个大就可以,当然这道题用递归完全可以写出来,只要把重复计算的值存储起来就可以了。但用动态规划的思路更容易,即从倒数第二层开始进行运算,把下面相邻两个数里面最大的那个加到当前位置,然后运算到第一层时就可以得到答案了。

完整代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAX 110
using namespace std;
int dp[MAX][MAX];
int main(void){
    int n;
    while(cin >> n){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++)
                cin >> dp[i][j];
        }
        for(int i=n-1;i>=1;i--){//从倒数第二层开始进行运算 
            for(int j=1;j<=i;j++){
                dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + dp[i][j];//相邻两个最大的加上当前位置的值 
            }
        }
        cout << dp[1][1] << endl;
    } 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值