【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] ...
随机推荐
- SOCKET 实现NAT 穿越
在当前IPv4NAT盛行的网络环境下,两个用户要直接进行P2P连接是非常困难的.较好的解决办法是借助含公网的用户或是服务器中介实现P2P连接. NAT:Network Address Translat ...
- 【转】Linux下查看TCP网络连接情况
查看TCP网络连接情况 命令:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ www.2cto.com 返回结 ...
- poj 3180 The Cow Prom(tarjan+缩点 easy)
Description The N ( <= N <= ,) cows are so excited: it's prom night! They are dressed in their ...
- hdu 5344 MZL's xor(数学之异或)
Problem Description MZL loves xor very much.Now he gets an array A.The length of A ≤i,j≤n) The xor ...
- QString转换为char*
QString在Qt里相当于C++里的std::string,或者是C里的c style string.不过,QString跟编码相关,在低层想把一个QString发送出去相当麻烦,尤其对方用的不是Q ...
- proxy 利用get拦截,实现一个生成各种DOM节点的通用函数dom。
const dom = new Proxy({}, { get(target, property) { return function(attrs = {}, ...children) { const ...
- Android学习总结——TextView跑马灯效果
Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...
- html和css实现一级菜单和二级菜单学习笔记
实现一级菜单: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
- leetcode先刷_Unique Paths II
那么上述问题,假设这个矩阵堵塞障碍,不能在若干组合前面所用的方法,因为这么多的位置实际上是没有办法的事儿. 还有剩下的唯一合理的解决方案dp该.与最低要求,并且等,从右下角以前突起,对于位置(i, j ...
- CSS减肥的工具–Firefox插件 CSS Usage
首先,我们需要安装Firefox(猛击此处下载),或者确定你已经安装的版本已经高于3.1; 第二步,安装前端开发人员最普及的开发工具 Firebug: 第三步,安装CSS Usage 0.3.4.1: ...