c++ 动态规划(dp)

题目描述

观察下面的数塔。写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大。
每一步可以从当前点走到左下角的点,也可以到达右下角的点。

输入

5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11

输出

86

AC代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 505;
int dp[MAXN][MAXN],a[MAXN][MAXN];
int max(int a,int b)//max函数求两个数字之间的最大值
{return a>b?a:b;
}
int main()
{int n;cin >> n;for (int i = 1;i <= n;i ++)//输入{for (int j = 1;j <= i;j ++){cin >> a[i][j];}}dp[1][1] = a[1][1];//把起点直接放在dp[]里面for (int i = 2;i <= n;i ++){for (int j = 1;j <= i;j ++){dp[i][j] = max(dp[i - 1][j - 1],dp[i - 1][j]) + a[i][j];//dp公式,原理是先走一步,然后扫描这个点的上一层的邻接点看看哪个点的dp值最大,然后用最大值加上他本身}}int ans = 0;for (int i = 1;i <= n;i ++){ans = max(ans,dp[n][i]);//ans的作用是在最底部的元素中找一个最大的dp,输出}cout << ans << endl;return 0;
}

另外一种方法

#include <iostream>
#include <string>
#include <algorithm>//STL库函数
using namespace std;
int main()
{int t,n,dp[105][105],a[105][105];cin >> t;//t组数据while (t --)//重复执行直到t组数据都处理完{cin >> n;//塔的层数for (int i = 1;i <= n;i ++)//输入{for (int j = 1;j <= i;j ++){cin >> a[i][j];//把塔转化成数组}}memset(dp,0,sizeof(dp));//把dp的值初始化为0for (int i = 1;i <= n;i ++)//把a[]最后一行赋值到dp[],因为最后一行的dp[]就等于最后一行数本身{dp[n][i] = a[n][i];}for (int i = n - 1;i >= 1;i --){for (int j = 1;j <= i;j ++){dp[i][j] = max(dp[i + 1][j + 1],dp[i + 1][j]) + a[i][j];//dp公式,原理是扫描这个点的下一层的邻接点看看哪个点的dp值最大,然后用最大值加上他本身,在把大的值选中}}}cout << dp[1][1] << endl;//输出return 0;
}

转载于:https://www.cnblogs.com/LJA001162/p/11234619.html

c++ 动态规划(数塔)相关推荐

  1. 55 - 算法 -动态规划 -数塔问题 感觉都是数组建模 递推方法规则

    //模板#include <iostream> #include <cstdio> #include <string> using namespace std;/* ...

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

    动态规划–数塔问题 今天学习了动态规划的数塔问题,老师给我们讲了三种方法. (1)第一种方法是原始的递归,就是从上往下看一个n层塔的最大路径问题可以转化为选出左右两个n-1层塔的最大路径问题的较大值, ...

  3. python 动态规划 数塔_数塔问题,简单的动态规划算法

    /* 数塔问题: 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走, 一直走到底层,要求找出一条路径,使路径 ...

  4. 动态规划——数塔(hdu2084)

    首先介绍一下动态规划: 动态规划(dynamic programming),我们称之为DP,是求最优解的一种很常见的方法. 思想和背包基本一样,如对背包感兴趣的可以移步 http://blog.csd ...

  5. 动态规划——数塔问题

    从原点(顶层)出发,只能向左或者向右,找到一条路径使得路径上的数字和最大: #include<stdio.h> //#include"algorithm.h" #def ...

  6. 算法.动态规划 导航/数塔取数字问题

    目录 前言 从1+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...

  7. C简单动态规划——爬数塔

    问题描述: 小明在某个角落发现了一座由数字组成的斜塔,他I想到塔顶去看看.小明可以从底层任意一个数字出发逐层爬上去,每次可以爬至上一层数字上或者上一层左边相邻的数字上(第1列只能爬至正上方上一层的数字 ...

  8. 算法学习(动态规划)- 数塔问题

    前言 之前碰到了扔鸡蛋问题(给你2个鸡蛋,在100层楼上扔,要求想出一个好的策略,去测出哪一层楼开始鸡蛋就会碎掉),一直摸不着头脑.后来才知道可以使用"动态规划"这种思想(或者叫算 ...

  9. 动态规划2(数塔问题)

    数塔问题是二维情况下动态规划的经典问题,下面以洛谷的一个例题来分析数塔问题以及动态规划:原题链接 题目描述 观察下面的数字金字塔.写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大 ...

最新文章

  1. 解决运行pytorch程序多线程问题
  2. 产品层级提升,产品实战系列之教你如何对货运APP进行运单界面优化
  3. Java 洛谷 P1089 津津的储蓄计划讲解
  4. Android HelloWorld 例子
  5. 3.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(三)
  6. ListBox的使用
  7. java反射有什么用_java反射的作用知识点总结
  8. 一文读懂工业设备的两种通讯方式:现场总线和工业以太网
  9. 程序员找工作那点事儿
  10. mysqldump 备份原理8
  11. mybatis generator使用总结
  12. 建立一个vs+qt打开系统摄像头的程序
  13. GitHub的page构建自己的博客以及添加自己的域名
  14. bme java_为什么bme280.startreadout()只触发一次?
  15. oracle dba_hist_sql,从dba_hist_sqlstat视图中查找过去时段最占用资源的会话
  16. 计算机组成原理 存储器
  17. 没考驾照的恭喜了!上海打响第一枪!
  18. 定时执行mysql数据库任务方案
  19. wxpython后台如何更新界面信息_wxpython后台线程更新界面控件方法
  20. 【NOI科目校 信息学知识点测评-组合计数专题】展览方案

热门文章

  1. [转]阮一峰:蒙特卡罗方法入门
  2. VueJs路由跳转——vue-router的使用
  3. android SDK Manager 代理服务器设置
  4. 苹果App Icon的问题
  5. [leetcode]Divide Two Integers
  6. 怎么写redmine wiki
  7. 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据
  8. Facebook如何向十亿人推荐东西
  9. vmx转换ofv模板,导入esxi
  10. 【跃迁之路】【488天】程序员高效学习方法论探索系列(实验阶段245-2018.06.08)...