动态规划——数塔问题

从数塔顶层出发,每个结点可以选择向左走或向右走,要求一直走到塔底,使得走过的路径上的数值和最大。

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100;
// 下面这个函数实现的是更新最大值,o赋值为o和x的最大值
template <class T>
void updateMax(T& o, const T& x) {
    o = (o > x) ? o : x;
}

// f数组为动态规划的状态数组
// num数组为读入的数塔
// n为读入的数塔高度
int f[N][N], num[N][N], n;

int main() {
    // 读入n和数塔数组num
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= i; ++j) {
            scanf("%d", &num[i][j]);
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            //从上到下 用另一个数组储存走到当前最大的值
            updateMax(f[i][j],max(f[i - 1][j],f[i - 1][j - 1])+num[i][j]);
        }
    }// step 1 begin: 在这里实现动态规划算法逻辑

    // step 1 end.

    // 定义最终结果变量result,因为是计算最大值,所以初始化为0
    int result = 0;
    for (int i = 1; i <= n; ++i) {//因为上一个循环已经计算了值 所以可以直接在最后一层查找
        // step 2 begin: 在这里实现更新最终结果的逻辑
        updateMax(result,f[n][i]);//是赋值而不是交换 记住啦!!!!!!
        // step 2 end.
    }
    // 输出最终最大权值和result
    printf("%d\n", result);
    return 0;
} 

实现代码

时间: 2024-10-08 11:20:33

动态规划——数塔问题的相关文章

动态规划----数塔问题

一.问题描述 从数塔顶层出发,每个结点可以选择向左走或向右走,要求一直走到塔底,使得走过的路径上的数值和最大. 如上图所示的数塔,最大路径和为86,经过的路径从塔顶到塔底为13,8,26,15,24. 二.问题分析 要求的最大值可以从地形开始也可以从上面开始 动态规划函数为: resultTower[i][j] = tower[i][j] + Math.max(tower[i + 1][j],tower[i + 1][j + 1]); 边界值resultTower[heigh - 1][j] =

动态规划&amp;数塔取数&amp;矩阵取数&amp;背包问题&amp;最大子段和&amp;正整数分组

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.在面试笔试中动态规划也是经常作为考题出现,其中较为简单的DP题目我们应该有百分之百的把握顺利解决才可以. 一.动态规划定义动态规划实际上是一类题目的总称,并不是指某个固定的算法.动态规划的意义就是通过采用递推(或者分而治之)的策略,通过解决大问题的子问题从而解决整体的做法.动态规划的核心思想是巧妙地将问题拆分成多个子问题,通过计算子问题而得到整体问题的解.而子

G - 免费馅饼 HDU 1176 (动态规划---数塔的变形 )

G - 免费馅饼 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1176 Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接.但由

动态规划:数塔问题

动态规划问题我训练过一些题目,但是感觉自己掌握的还不是特别好! 下面以一道经典的动态规划题目说明动态规划算法的思想,文末会官方的给出对动态规划的文字叙述. 先看题目:如下图(图片来自百度图片)是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大. 思路分析: 这道题目如果使用贪婪算法不能保证找到真正的最大和. 在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算. 从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还

hdu2084动态规划入门题----数塔

原题:数塔 这个是动态规划入门题,比较简单. 题意是: 一个数字组成的三角形,从上到下找一条路径,使这条路径上数字之和最大. 解题思路,就是要从下往上看.举个例子: 如果你从上到下走到了第4行第1个数,也就是2,那么接下来有两个数可以走19和7,而你必然会选择19. 所以就可以根据这个思路更新上面一行的数.把2更新成2+19=21.18更新成18+10=28,9更新成9+10=19,5更新成5+16=21 重复上面的思路最后第一行累加出来的就是最大值了. 思路很简单,最简单的实现就是你也开一个二

hdu 2084 数塔 dp 动态规划

开始动态规划的学习了,先是比较基础的,很金典的数塔.附上题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2084 这题的状态转移方程是  dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + m[i][j]; (dp[i][j] 表示在第 i 层 第 j 列时的最大和) . 然后一个双重循环,边能算出.当然可以用滚动数组.但是注意用滚动数组解题时,第二层循环 j 必须从大到小, 因为 状态转移方程 为  f  [ j

c++动态规划解决数塔问题

#include <iostream>#include <algorithm> using namespace std; /************************************************************************//* 数塔问题 *//************************************************************************/const int N = 50;//为了算法写

hdu2084 数塔 动态规划第二题

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25898    Accepted Submission(s): 15621 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

HDU 2084 数塔 简单动态规划

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目大意:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 题目分析:首先我们可以给数塔中的每一个点制定一个坐标.最上面的9的坐标是(1,1),第二行的12的坐标是(2,1),15的坐标是(2,2),以此类推,第i行的第j个数的坐标就是(i,j).我们假设一共有n行,并且设a[i][j]为坐标为(i,j)对应的数,f[i][j]为从(i,j)