【DP问题集】动态规划试题
1.背包问题
给定n种物品和一背包。物品i的重量是wi,其价值为pi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
分析:
①每个物品只有两种选择,要么就是塞到包里面,要么就是不要了;
②当背包剩余容量为j时,如果第i件物品重量wi>j时,必定是要不了的,如果wi<j时,可以选择要或者不要,因为要了之后背包空间减少,会影响后面的选择;
③假设剩余容量j的背包从i到n这n-i+1种物品中能选出的最大总价值记为m[i,j],那么对于原问题:容量为C的背包,从1到n中物品中能选出的最大总价值则可以记为m[1,C];
④寻找递推式——动态规划,其实就是用递推来代替递归,利用多个相同或者不同的子问题的输出得出一个包含这些子问题的输出,是典型的牺牲空间换取速度的做法。
那么m[i,j]可以分为两种情况
当已知m[i+1,j]时,
m[i,j] = m[i+1, j] , wi>j
m[i,j] = max(m[i+1, j], m[i+1, j-wi]+pi) , wi<j (此处的m[i+1, j-wi]是因为决定选择第i个物品时,剩余空间减少为j-wi)
举个例子:
假设现有5种物品,且它们的重量和价值分别如下所示:
| n | 1 | 2 | 3 | 4 | 5 |
| wi | 1 | 2 | 3 | 4 | 5 |
| pi | 2 | 3 | 6 | 4 | 7 |
背包容量为7。
| j\i | 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 0 | 0 | 0 | 0 |
| 2 | 3 | 3 | 0 | 0 | 0 |
| 3 | 6 | 6 | 6 | 0 | 0 |
| 4 | 8 | 6 | 6 | 4 | 0 |
| 5 | 9 | 9 | 7 | 7 | 7 |
| 6 | 11 | 9 | 7 | 7 | 7 |
| 7 | ?=11 | 10 | 10 | 7 | 7 |
那么根据上面的递推公式,我们试试解出m[1,7]=max(m[2,7], m[2,7-1]+2)=max(m[2,7], m[2,6]+2)=max(10, 9+2)=11。
2.最长递增序列
给定一个序列,求至少删除几个数,使得序列呈递增序列,返回最长递增序列长度。(递增序列要求ai≤ai+1)
<分析明天给出,敬请期待>
#include <stdio.h>
#include <stdlib.h> int input_array(int **a){
int n, k;
scanf("%d", &n);
*a = (int*)malloc(sizeof(int)*n);
for(k=0; k<n; k++){
scanf("%d", *a+k);
}
return n;
} int maxlen(int *a, int n){
int k, mk;
int *m;
int mlen; if(a==NULL)
return 0;
m = (int*)malloc(sizeof(m)*n);
if(m==NULL)
return 0;
//初始化dptemp
*m = *a;
mlen = 1;
for(k=1; k<n; k++){
for(mk=mlen-1; mk>=0; mk--){
if(*(a+k)>=*(m+mk)){
if(mk==mlen-1){
*(m+mlen) = *(a+k);
mlen++;
}
else{
if(*(a+k)<=*(m+mk+1))
*(m+mk+1) = *(a+k);
}
break;
}
}
if(mk==-1){
if(*(a+k)<*m)
*m = *(a+k);
}
}
free(m);
return mlen;
} int main(void){
int *a, n; n = input_array(&a);
printf("maxlen = %d\n", maxlen(a, n)); system("pause");
return 0;
}
【DP问题集】动态规划试题的更多相关文章
- dp合集 广场铺砖问题&&硬木地板
dp合集 广场铺砖问题&&硬木地板 很经典了吧... 前排:思想来自yali朱全民dalao的ppt百度文库免费下载 后排:STO朱全民OTZ 广场铺砖问题 有一个 W 行 H 列的广 ...
- 9.15 DP合集水表
9.15 DP合集水表 显然难了一些啊. 凸多边形的三角剖分 瞄了一眼题解. 和蛤蛤的烦恼一样,裸的区间dp. 设f[i][j]表示i~j的点三角剖分最小代价. 显然\(f[i][i+1]=0,f[i ...
- 9.14 DP合集水表
9.14 DP合集水表 关键子工程 在大型工程的施工前,我们把整个工程划分为若干个子工程,并把这些子工程编号为 1. 2. --. N:这样划分之后,子工程之间就会有一些依赖关系,即一些子工程必须在某 ...
- 区间Dp 暴力枚举+动态规划 Hdu1081
F - 最大子矩形 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- 杭电dp题集,附链接还有解题报告!!!!!
Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f ...
- POJ1417 True Liars 并查集 动态规划 (种类并查集)
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1417 题意概括 有一群人,p1个好人,p2个坏人. 他们说了n句话.(p1+p2<=600,n ...
- 数位dp题集
题集见大佬博客 不要62 入门题,检验刚才自己有没有看懂 注意一些细节. 的确挺套路的 #include<bits/stdc++.h> #define REP(i, a, b) for(r ...
- TYVJ1071 LCIS 线性DP+决策集优化
问题描述 TYVJ1071 题解 暴力\(\mathrm{DP}\) 首先,一个\(O(n^3)\)的解法: 设\(opt_{i,j}\)代表\(a\)的前\(i\)个和\(b\)的前\(j\)个的\ ...
- dp练习集
动态规划(DP) // 以下题目来自牛客网 删括号 f[i][j][k] 表示序列s的前i个匹配序列t的前j个,序列s删除部分左括号与右括号数量差为k的情况是否可行 答案为 f[sl][tl][0] ...
随机推荐
- DBA 经典面试题(1)
1:列举几种表连接方式 hash join. merge join. nest loop join(cluster join). index join 2:不借助第三方工具,怎样查看sql的执 ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
- 涂抹Oracle笔记2:数据库的连接-启动-关闭
一.数据库的连接sqlplus <username>[/<password>][@<connect_idertifier>]|/[as sysdba| as sys ...
- EffectiveC#7--选择恒定的原子值类型数据
1.恒定类型就是一但它们被创建,它们(的值)就是固定的. 恒定类型可以很好的在基于哈希代码的集合上工作.以Object.GetHashCode()方法返回的值,对同一个实例是必须相同的 2.一个客户类 ...
- 一个Demo就懂的Angular之directive
<body> <div ng-controller="myCtrl"> <hello-word></hello-word> < ...
- gdal_merge.py
1 gdal_merge.py: 合并(Merge)/镶嵌(Mosaic)工具.要求图像必须是相同坐标系统.具有相同的波段数:可以不同分辨率,可以有重叠区域(后加入图像覆盖先加入的图像). 注意:只能 ...
- json返回数据拼接HTML
<div class="box-lists"> </div> $.ajax({ url: 'AjaxPage/AjaxHandler.ashx', typ ...
- asp.net利用Ajax和Jquery在前台向后台传参数并返回值
1----------前台 首先需要 Jquer的包 <script src="js/jquery-1.9.1.js" type="text/javascript& ...
- CGContext
CGContext又叫图形上下文,相当于一块画布,以堆栈形式存放,只有在当前 context上绘图才有效.iOS有分多种图形上下文,其中UIView自带提供的在drawRect:方法中通过 UIGra ...
- jar文件运行打断点
eclipse中jar包打断点 1. 下载工具 链接:http://pan.baidu.com/s/1jHSXMSm 密码:3aww 或者: 1下载jad.exe,地址: http://www.kpd ...