【欧拉计划】Q12:数塔问题

数塔问题


  • 递推与递归
  • 动态规划

1.onlineJ43:数塔问题

  • 原题链接:http://oj.haizeix.com/problem/43

有一个由数字组成的三角形数塔,站在上一层的某个点,只能到达其下方左右的两个点。现在请找到一条从上到下的路径,使得路径上所有数字相加之和最大

image-20210417201534724

1.递推法从上向下求和
  1. 由数塔中到达任意一点的数字和sum = 左上方数字和suml or 右上方数字和sumr + 该数字数值num
  2. 知到达该点最大和为ans[x][y] = max(ans[x - 1][y - 1], ans[x - 1][y]) + num[x][y]关键
  3. 遍历最后一行,找出最大的数字即为结果

image-20210418110447750

#include<iostream>
#include<cstdio>
using namespace std;

int n;
int num[1005][1005];

int main(){
   
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i){
   
        for(int j = 1; j <= i; ++j){
   
            scanf("%d", &num[i][j]);
        }
    }
    //1.从两个方向取数值大的方向max(num[i - 1][j - 1], num[i - 1][j]);
    for(int i = 1; i <= n; ++i){
   
        for(int j = 1; j <= i; ++j){
   
            num[i][j] += max(num[i - 1][j - 1], num[i - 1][j]);
        }
    }
    int ans = 0;
    //2.遍历最后一行,找出最大的数字即为结果
    for(int i = 1; i <= n; ++i){
   
        ans = max(ans, num
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值