紫书-第9章-动态规划初步
文章平均质量分 70
冷月残星
这个作者很懒,什么都没留下…
展开
-
动态规划(城市里的间谍,uva 1025)
#include#define INF 0X3F3F3F3Fusing namespace std;int N,T;int t[55];int M1,M2;int d[55];int e[55];int dp[210][55];bool ht[210][55][2];int kase;int main(){ while(scanf("%d",&N),N)原创 2016-09-16 18:36:20 · 736 阅读 · 0 评论 -
树形DP(Hali-Bula的晚会,uva 1220)
#include#define maxn 210#define INF 0X3F3F3F3Fusing namespace std;int n;mapID;vectorMAP[maxn];int cnt;int dp[2][maxn];int F[2][maxn];void dfs(int u,int f){ for(unsigned int i=0;i<MAP[u原创 2016-09-20 20:01:57 · 470 阅读 · 0 评论 -
树形DP(完美的服务,uva 1218)
INF不能弄太大,因为会不停地累加很多次,事实上加三次就爆了。INF一直习惯了用0X3F3F3F3F,这不好,特别是DP时状态转移需要累加的情况,应该弄得比可能的上界再大一点点就好了。或者你可以不停地判断,让值最高只能达到INF。代码#include#define maxn 10010#define INF 10010using namespace std;int N;原创 2016-09-20 21:31:26 · 362 阅读 · 0 评论 -
动态规划(装满水的气球,uva 10934)
一开始 rte 是因为用了%I64d而没用%lld。在VJ上做的忘了是UVA上的题后来 tle 是因为用了 while(scanf("%lld %lld",&k,&n),k+n) 而没用 while(scanf("%lld %lld",&k,&n)&&k)。题目描述与样例输入不符。还记得刘汝佳的一句话:程序要尽量写的鲁棒,因为哪怕是世界级的比赛,都会因为题目描述错了或者疏忽从而导致无法AC。这原创 2016-09-24 01:59:08 · 825 阅读 · 0 评论 -
记忆化搜索,状压DP(校长的烦恼,uva 10817)
每门课至少有两名教师可以教。定义三维d[i][s1][s2]的状态,对于第i到最后一个教师,有且只有1个老师的课的集合是s1,大于等于2个教师的课的集合是s2。前m个教师都不能辞退,因此必须选,此时d[i][s1][s2]=d[i+1][s1'][s2'],其中s1',s2'分别是是选了第i个教师后的s1和s2。其他教师可选可不选。不选的话d[i][s1][s2]=d[i+1][s原创 2016-09-21 15:49:15 · 386 阅读 · 0 评论 -
记忆化搜索,状压DP(20个问题,uva 1252)
要学会找到“决策”和“状态”。在这题中,“决策”无非就是问哪个问题,而问过的问题就不能再问了,因此需要已问过哪些问题的“状态”。每次询问,无非得到两个结果,是或不是,所以还需要“状态”:问过的问题中,那些得到了肯定的回答。问问题的顺序不会影响结果,因此需要记忆化搜索。状态转移方程: ans=min(ans,max(dp(s|(1题目要求找最少问几次保证问出。保证问出原创 2016-09-21 18:40:49 · 618 阅读 · 0 评论 -
动态规划(基金管理,uva 1412)
想了很久都没想明白为什么状态总数不超过13000种,找到了递推式,但觉得只能通过dp或枚举得到。事先计算出所有可能的状态,然后构造一个状态转移表。把程序每一个大的步骤都写在函数内,结构清晰。频繁使用的函数封装起来,如update。保存路径多开一个空间,这样找路径时就可以O(n)而不是O(n^2)。递归倒序打印。刷表法dp前要全部赋值一遍,代表从未访问过。把一股的价格改为原创 2016-09-26 10:31:59 · 510 阅读 · 0 评论 -
区间DP(修缮长城,uva 1336)
十几发一直RTE和TLE。万万没想到是输入输出的问题。。。while(scanf("%d %d %d",&n,&v,&x)&&n+v+x)这样也不行while(scanf("%d %d %d",&n,&v,&x)&&(n+v+x))也不知道为啥。改成while(scanf("%d %d %d",&n,&v,&x)==3&&n)或while(~scan原创 2016-09-26 14:27:48 · 1008 阅读 · 0 评论 -
记忆化搜索(跳舞机,uva 10618)
今天写了好久都没写出来,后来看别人代码才过了。刚开始写的时候,觉得决策十分复杂,一直在讨论,写了很长。后来打印决策的时候遇到了更大的麻烦,只好用dfs递归去打印。代码长到爆炸,而且还WA了。后来看别人代码,学到几个技巧。在dp时直接暴力枚举所有决策,然后写一个函数判断是否合法即可。能量消耗也不需要在dp时判断,直接交给函数处理就好了。最开始之所以WA是因为路径保存错了。我只保存原创 2016-09-22 19:59:38 · 667 阅读 · 0 评论 -
区间DP(括号序列,uva1626)
发现动态规划,记忆化搜索,bfs之类的寻找最优解的算法,往往会有一些寻找最优解过程中的记录。通过观察这些记录,我们能寻到一些蛛丝马迹,从而找到最优解是如何一步一步形成的。因此可以打印决策过程,或者说可以还原我们是如何一步一步找到答案的,比如打印最短路径,又或者如此题中打印解。以前BFS还能打印路径就觉得很神奇了。今天碰到区间DP,用递归的方法还原路径,学到了。关于记忆化原创 2016-09-19 17:22:35 · 575 阅读 · 0 评论 -
记忆化搜索,动态规划(巴比伦塔,uva 437)
#include#define INF 0X3F3F3F3Fusing namespace std;int n;int blc[35][3];int dp[35][3];int kase;int DP(int k1,int k2){ int& ans=dp[k1][k2]; if(ans>0) return ans; ans=blc[k1][k2];原创 2016-09-16 20:16:25 · 639 阅读 · 0 评论 -
记忆化搜索,动态规划(旅行,uva 1347)
看到这题想起了一个网络流的题目,就是说找两条不相交的路,使得总花费最短,解决办法是拆点法。这道题用网络流做边太多了,估计不行。。。#include#define maxn 1010using namespace std;typedef long long ll;ll n;struct pt{ ll x,y;};pt PT[maxn];double dp[原创 2016-09-16 21:04:57 · 398 阅读 · 0 评论 -
动态规划(Unidirectional TSP,uva 116)
dp里面sort用的好棒,我本来讨论了老半天的。。。#includeusing namespace std;const int INF=1<<30;int n,m;int MAP[11][110];int dp[11][110];int NEXT[11][110];int main(){ while(scanf("%d %d",&n,&m)!=EOF)原创 2016-09-16 23:09:14 · 357 阅读 · 0 评论 -
01背包,恰好装满(劲歌金曲,uva 12563)
关于不一定装满与恰好装满: http://blog.sina.com.cn/s/blog_150cffdab0102w0g9.html参考代码:http://blog.csdn.net/acvay/article/details/43601791我的代码#includeusing namespace std;int n,t;int dp[20000];转载 2016-09-18 20:18:51 · 842 阅读 · 0 评论 -
动态规划(照明系统设计,uva 11400)
参考资料:http://acm.lilingfei.com/uva-11400-lighting-system-design-%E4%BE%8B%E9%A2%989-6_138只能往上换,不能往下换,电压最高的灯泡必须保留。参考资料上证明了不能隔着换。代码#includeusing namespace std;struct bb{ int V,K,C转载 2016-09-18 21:27:23 · 537 阅读 · 0 评论 -
动态规划(划分成回文串,uva 11584)
对每个位子进行DP时要先初始化一下他的值,这是就要考虑到有没有在接下来的循环中没能考虑到的边界情况,如果有,就在这些没有考虑到的情况中选一个最优解最为初始值,情况很少,往往判断一下就OK。如果没有遗漏的情况,那就给他赋一个一定会被替换的值,比如求最小值,你就给他赋INF,求最大值,你就给他赋-1或-INF。但要保证这个值一定会被替换,而且不会被认为是某个正确的结果。#includeu原创 2016-09-19 11:01:29 · 862 阅读 · 0 评论 -
动态规划(颜色的长度,uva 1625)
一开始用刷表法,每次都要memset,超时了。然后改成填表法就过了。AC代码#include#define maxn 5010#define INF 0X3F3F3F3Fusing namespace std;char s1[maxn];char s2[maxn];int st1[30];int st2[30];int ed1[30];int ed2[30]原创 2016-09-19 13:23:34 · 674 阅读 · 0 评论 -
区间DP(切木棍,uva 10003)
每次切割的费用等于被切割的木棍长度。#includeusing namespace std;int l,n;int c[60];int dp[60][60];int main(){ while(scanf("%d",&l),l) { scanf("%d",&n); for(int i=1;i<=n;i++)原创 2016-09-19 16:22:53 · 571 阅读 · 0 评论 -
数位DP(越大越好,uva 12105)
http://blog.csdn.net/keshuai19940722/article/details/25080553学到一个小细节,调用strcpy(a,b)前一定要让a="\0"或者memset(a,0,sizeof(a))。否则会出问题。#includeusing namespace std;int n,m;int kase;char dp[110]转载 2016-09-26 16:55:44 · 643 阅读 · 0 评论