【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] ...
随机推荐
- 如何判断是REQUEST请求是来自移动终端还是来自PC端
public bool IsMoblie() { string agent = (Request.UserAgent + "").ToLower ...
- Palindrome Linked List 解答
Question Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O ...
- DBA 经典面试题(3)
这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度. 1.解释冷备份和热备份的不 ...
- 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- Unity调试中心
渐渐在公司接SDK3个月了,一直没有参加项目的游戏功能编写几乎快忘记Unity了, 看到那些前辈编写游戏到发布游戏,总结了下 每一个游戏应该有一个调试中心, 方便策划 测试更好的了解游戏和测试游戏. ...
- cookielib模块基础学习
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import cookielib #主要用于处理http客户端的co ...
- 常用JS代码整理
1: function request(paras) { 2: var url = location.href; 3: var paraString = url.substring(url.index ...
- java并发编程--Executor框架(一)
摘要: Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程 ...
- (3)选择元素——(6)属性选择器(Attribute selectors)
Attribute selectors are a particularly helpful subset of CSS selectors. They allow us to specify an ...
- Impala与Hive的比較
1. Impala架构 Impala是Cloudera在受到Google的Dremel启示下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批 ...