• 题目从简到易,很推荐初学者从树塔问题入门,简单易懂

下面就是一个典型树塔问题

  • 试题 算法提高 夺宝奇兵

[题目描述]
  在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图:

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

  ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5->7->8->3->7的顺序,将得到最大值30

[输入]
  第一行正整数N(100>=N>1),表示山的高度
  接下来有N行非负整数,第i行有i个整数(1<=i<=N),表示山的第i层上从左到右每条路上的珠宝数目试题 算法提高 01背包

[输出]
  一个整数,表示从山底到山顶的所能得到的珠宝的最大数目.

  • 思路:

树塔问题我们是从底部到顶部分析解决,不断更新每一层的最大数值,这样到最顶层,一定就是我们要找的答案啦。直接贴代码:

#include<stdio.h>
#include<algorithm>
#define Max -10000000
using namespace std;int hill[105][105];int main()
{int N;scanf("%d",&N);for(int i=1;i<=N;i++)for(int j=1;j<=i;j++)scanf("%d",&hill[i][j]);int sum=0;for(int i=N;i>=1;i--)//从最底层开始循环{for(int j=1;j<=i;j++){if(j==i) break;hill[i-1][j]+=max(hill[i][j],hill[i][j+1]);//上一层的数等于对应下一层的数与左边一个数之和}}    printf("%d",hill[1][1]);return 0;
}

接下来就是经典的01背包问题啦!

  • 试题 算法提高 01背包

问题描述

  给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.

输入格式

  输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
  以后N行每行两个数Wi和Vi,表示物品的重量和价值

输出格式

  输出1行,包含一个整数,表示最大价值。

样例输入

3 5
2 3
3 5
4 7

样例输出

8

数据规模和约定

  1<=N<=200,M<=5000.

  • 思路:搞清楚状态转移方程代表着什么,画一个二维的图一个一个演算就很难容易理解

DP[i][j]表示前i个物品,背包容量为j的最优解。表中第一行是背包容量 ,列对应的是可选的物品有哪些。顺便提一下,01背包也可以用一维数组优化。

源代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
int W[205];//物品重量
int V[205];//物品价值
int bag[205][5002];
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d%d",&W[i],&V[i]);for(int i=1;i<=n;i++)//前i个物品 {for(int j=0;j<=m;j++)背包容量 {if(j>=W[i])  //注意边界,背包容量要大于物品重量才能装bag[i][j]=max(bag[i-1][j],bag[i-1][j-W[i]]+V[i]);else bag[i][j]=bag[i-1][j]; }}printf("%d",bag[n][m]);return 0;  }

背包问题还有完全背包(每个物品可以选无数次)、多重背包(给定物品可选次数)等。因为昨天做了个类似多重背包的题,就顺便贴一下。

  • 试题 算法提高 贪吃的大嘴

问题描述

  有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕.

输入格式

  先输入一行包含2个整数m、n,表示大嘴需要吃美味度和为m的小蛋糕,而小蛋糕一共有n种,下面输入n行,每行2个整数,第一个表示该种小蛋糕的美味度,第二个表示蛋糕店中该种小蛋糕的总数

输出格式

  输出一行包含一个整数表示大嘴最少需要吃的小蛋糕数量,若大嘴无法通过吃小蛋糕达到m的美味度和,则输出"><“.

样例输入

10 2
4 1
2 10

样例输出

4

样例输入

10 2
4 1
7 3

样例输出

><

数据规模和约定

  m ≤ 20000,小蛋糕总数量≤50.

  • 思路:要达到一定的美味度,并且每一种蛋糕可用次数都有限,其实只用多加一层循环限定所选次数就可以了。是用一维数组写的,代码里有注释。
#include<bits/stdc++.h>
using namespace std;
const int inf=99999;int m,n;
int M[55],N[55];//美味度和个数
int dp[20005];//填入美味度为n时所吃蛋糕最小数量 int main()
{cin>>m>>n;for(int i=1;i<=n;i++)cin>>M[i]>>N[i];for(int i=1;i<=m;i++)dp[i]=inf;  //初始化为无穷for(int i=1;i<=n;i++)//循环每一种蛋糕{for(int j=1;j<=N[i];j++)//每一种蛋糕可以选用的次数 {for(int k=m;k>=M[i];k--)dp[k]=min(dp[k],dp[k-M[i]]+1);} } if(dp[m]>55) cout<<"><";else cout<<dp[m];return 0;
} 

这个题也可以用DFS搜出来,但我搜超时了,有想了解的可以去看看其他没有超时的大牛的博客www.

  • 试题 算法训练 拦截导弹

    问题描述

      某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

      输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

    输入格式

      一行,为导弹依次飞来的高度

    输出格式

      两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数

    样例输入

    389 207 155 300 299 170 158 65

    样例输出

    6
    2

  • 思路:这是一个典型的最长上升子序列和最长下降子序列问题,也是用DP.

#include<bits/stdc++.h>
using namespace std;int d1[10000],d2[10000];
int h[10000];
int num=0,ans=0;int main()
{int x,i=0;while(cin>>x) h[i++]=x;for(int j=0;j<i;j++)//每一个导弹高度 {d1[j]=d2[j]=1;for(int k=0;k<j;k++)//与之前每一个比较 {if(h[k]>h[j])d1[j]=max(d1[j],d1[k]+1);elsed2[j]=max(d2[j],d2[k]+1);}ans=max(ans,d1[j]);//最多 num=max(num,d2[j]);//最少导弹 }cout<<ans<<endl<<num;return 0;
}

DP有时候蛮难理解,只有一步一步把它的状态都搞清楚才能有所理解,学会了确实是很好用的!

动态规划(DP)--入门题相关推荐

  1. 数位dp入门题 洛谷P2657 [SCOI2009] windy 数

    题干 传送门 windy 定义了一种 windy 数. 题目描述 不含前导零且相邻两个数字之差至少为 2的正整数被称为 windy 数.windy 想知道,在 a 和 b 之间,包括 a 和 b ,总 ...

  2. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  3. 动态规划DP模板题汇总

    前言 动态规划的实现逻辑是画图分前后状态,二维数组肯定能解决,但是为了降低复杂度,又会转换成一维数组,线性DP,或者存在反向DP,能节省很多思考的情况.并且保证状态的更新不会影响之前状态的计算结果. ...

  4. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  5. HDU3507-Print Article-斜率dp入门题

    为了学CDQ分治,从斜率dp和凸包开始做吧.. 代码就是维护一个凸包.利用递增的性质丢掉不合适的点. http://www.cnblogs.com/Rlemon/p/3184899.html 代码学的 ...

  6. c语言dp算法,C++动态规划dp算法题

    问题1:找硬币,换钱的方法 输入: penny数组代表所有货币的面值,正数不重复 aim小于等于1000,代表要找的钱 输出: 换钱的方法总数 解法1:经典dp,空间复杂度O(n*aim) class ...

  7. 石子归并 51Nod - 1021(区间DP入门题)

    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. 例如: 1 2 3 4,有不少 ...

  8. P2704 炮兵阵地 (状压dp入门题) 题解

    题意简述:给定一个大小为n*m的棋盘,棋盘上'H'表示不可放置,'P'表示可放置,一个棋子在棋盘上的攻击范围是其左右上下2格以内,求不冲突情况下的最多摆放棋子数. 分析:决策是对于一个P格子考虑放或不 ...

  9. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  10. hdu 2089 数位dp入门

    HDU 2089 题意:中文题 思路:数位dp入门题 AC代码: #include "iostream" #include "string.h" #includ ...

最新文章

  1. 网络无线AP信号走场测试软件(Ekahau 使用说明)
  2. shell编程学习笔记--整数自增
  3. boost::irange相关的测试程序
  4. Myeclipse下Maven的配置
  5. NVIDIA英伟达:深度学习服务器搭建指南 | 交流会笔记
  6. postgresql 动态添加过滤条件_XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件...
  7. 第四章——变换域处理方法
  8. MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn
  9. MATLAB websave批量下载(URL)
  10. AD20 mill与mm转换
  11. 编写一个加密程序,要求从键盘输入一个字符串,然后输出加密后的字符串。加密规则是对每个字母转换为下一个字母表示,原来是a转换为b,原来是B转换为C。小写的z转换为小写的a,大写的Z转换为大写的A。
  12. 深圳以招聘忽悠面试的培训机构
  13. 参考文献引用详细教程
  14. 1976年图灵奖--米凯尔·拉宾和达纳·斯科特简介
  15. git 删除文件后如何恢复此文件
  16. 前端基础 互联网 DNS 服务器 浏览器
  17. 在线教育报告上线,助力职业与成人教育行业高效运营
  18. 清亡之路(4):最受误解的东南互保
  19. Secret Milking Machine POJ - 2455
  20. 手机iCloud储存空间已满,怎么解决?

热门文章

  1. c 语言 按路径创建文件夹
  2. 涉密计算机安全审计分析报告,涉密信息安全保密审计报告
  3. 计算机二级access操作题函数讲解,计算机二级数据库access操作题答案讲解学习
  4. 普元nui:Navigations
  5. uniapp 复选框样式 修改
  6. “交通·未来”第6期:做有灵魂的交通研究——我的一些小经验
  7. WebView截长图解决方案
  8. 幼儿园计算机教学计划,幼儿园大班计算机教学计划 .doc
  9. 为什么死循环占用CPU高
  10. vi/vim下字符串搜索