随笔分类 -  动态规划

摘要:HDU4283You Are the One区间dp,记忆话搜索运行时间:#include #include #include using namespace std;const int maxn = 105,inf = 1 e)return 0; if(dp[s][e][k] != inf)return dp[s][e][k]; for(int i = s; i #include #include using namespace std;const int maxn =105;const int inf = 1#include #define Max(a,b) (a)>(b)?(... 阅读全文
posted @ 2013-08-12 09:53 一生挚爱 阅读(247) 评论(0) 推荐(0)
摘要:状态转移方程:dp[u][0] = max(dp[v][0],dp[v][1]);dp[u][1] += dp[v][0];#include #include #include #include #include using namespace std;const int maxn = 6010;vectortree[maxn];int rat[maxn],deg[maxn],dp[maxn][2];int max(int x,int y){ return x > y ? x : y;}void dfs(int u){ if(0 == tree[u].size()) { ... 阅读全文
posted @ 2013-07-29 08:55 一生挚爱 阅读(144) 评论(0) 推荐(0)
摘要:状态压缩动态规划动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。*:一般有个数据 n 0){if(x & 1) num ++;x >>= 1;}return num;}*:然后就是DP部分了,明确好状态转移方程。先特殊处理第1行,然后按状态转移方程求出剩下的值。经典问题:TSP一个n个点的带权的有向图,求一条路径,使得这条路经过每个点恰好一次,并且路径上边的权值和最小(或者最大)。或者求一条具有这样性质的回路,这是经典的TSP问题。n dp[j][1] 阅读全文
posted @ 2012-09-19 09:39 一生挚爱 阅读(168) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1421状态Dp[i][j]为前i件物品选j对的最优解当i=j*2时,只有一种选择即 Dp[i-2][j-1]+(w[i]-w[i-1])^2当i>j*2时,Dp[i][j] = min(Dp[i-1][j],Dp[i-2][j-1]+(w[j]-w[j-1])^2)#include#includeusing namespace std;#define min(x,y) (x)= j*2)//当i-1>= j*2的时候 dp[i][j] = min(dp[i-1][j],dp[i-2][j 阅读全文
posted @ 2012-08-30 09:43 一生挚爱 阅读(179) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3732题目大意:阿辉要记单词,所有单词的长度都不超过10个字符,每个单词都有一定的价值跟复杂性,知道每个单词的价值跟复杂性都写下来了,阿辉写单词的总的复杂度不能超过C,要你求阿辉可以得到的最大价值。解题思路:乍一看本题为一个简单0 1背包问题,但用0 1 背包做的时间复杂度为10^9在一秒中内不可能完成,但细看题目后发现Vi和Ci都小于等于10也就是说价值和费用的种类总共只有一百种,只需要统计所有价值、费用相同的数目及可以将问题转化为一个多重背包问题。源码及注释:#include#includein 阅读全文
posted @ 2012-08-24 07:42 一生挚爱 阅读(120) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=2392题目大意:有一头奶牛要上太空,他有很多种石头,每种石头的高度是hi,但是不能放到ai之上的高度,并且这种石头有ci个将这些石头叠加起来,问能够达到的最高高度。解题思路:先将石头可以放置的最大高度按从小到大的顺序进行排序,因为只有先放置最大高度最低的才能得到最优解,也就是说让一种石头尽可能高的放。最大值必须初始化为0,因为存在高度为0的情况。#include#include#includeusing namespace std;int dp[400005];struct node{ int h,a,c; bool operat 阅读全文
posted @ 2012-08-18 17:09 一生挚爱 阅读(203) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2639第K优解问题其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。这里仍然以01背包为例讲解一下。首先看01背包求最优解的状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。如果要求第K优解,那么状态f[i][v]就应该是一个大小为K的数组f[i][v][1..K]。其中f[i][v][k]表示前i个物品、背包大小为v时,第k优解的值。 “f[i][v]是一个大小为K的数组”这一句,熟悉C语言的同学可能比较 阅读全文
posted @ 2012-08-18 10:55 一生挚爱 阅读(145) 评论(0) 推荐(0)
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=2955题目大意:有一个小偷要偷银行的钱,可是他偷没家银行总是有一定的概率被抓,现在给了你一个概率P,只要他被抓的概率乘积不大与P,他就是安全的。问你在他安全的情况下,他最多可以偷多少钱。容量为银行钱的总和,价值就是偷到的钱,花费就是被抓的概率。dp方程:dp[j] = Max(dp[j],dp[j-w[i]]*(1-p[i])) #include#include#includeint w[101];float dp[10005];int main(){ int t,n,i,j,sum; float p, 阅读全文
posted @ 2012-08-17 20:04 一生挚爱 阅读(152) 评论(0) 推荐(0)
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=2159二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a[i]和b[i]。两种代价可付出的最大值(两种背包容量)分别为V和U。物品的价值为w[i]。简单二维费用背包问题,解题源代码及注释如下:#include#includeint a[100],b[100],dp[1001][1001];int main(){ i 阅读全文
posted @ 2012-08-16 08:55 一生挚爱 阅读(126) 评论(0) 推荐(0)
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=2844本题为简单多重背包,解题源码及注释如下:#include#includeint w[101],c[101],dp[100100];int max(int a,int b){ return a > b ? a : b;}int main(){ int n,m,num; int i,j,k; while(scanf("%d%d",&n,&m) != EOF && (m||n)) { for(i = 0; i m)//完全背包 { for(j = 阅读全文
posted @ 2012-08-15 20:11 一生挚爱 阅读(198) 评论(0) 推荐(0)
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=1171本题为一个简单的多重背包问题。解题源码及注释:#include#includeint max(int a,int b){ return a > b ? a : b;}int main(){ int N,sum,V,i,j,k; int w[51],n[51];//w[i]用来保存第i件物品的价值,此题中费用与同一物品的价值相等,n[i]用来保存第i件物品的数量 int dp[250000];//总价值最大为250000 while(scanf("%d",&N) , 阅读全文
posted @ 2012-08-15 16:23 一生挚爱 阅读(105) 评论(0) 推荐(0)
摘要:Cash MachineTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 19960Accepted: 6954DescriptionA Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount. The machine uses exactly N distinct bill denominations, say Dk, k= 阅读全文
posted @ 2012-08-07 10:29 一生挚爱 阅读(188) 评论(0) 推荐(0)
摘要:一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。 由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一 阅读全文
posted @ 2012-08-07 10:16 一生挚爱 阅读(198) 评论(0) 推荐(0)