紫书-第9章-动态规划初步
文章平均质量分 70
冷月残星
这个作者很懒,什么都没留下…
展开
-
动态规划(城市里的间谍,uva 1025)
#include #define INF 0X3F3F3F3F using 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 · 727 阅读 · 0 评论 -
树形DP(Hali-Bula的晚会,uva 1220)
#include #define maxn 210 #define INF 0X3F3F3F3F using 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 · 463 阅读 · 0 评论 -
树形DP(完美的服务,uva 1218)
INF不能弄太大,因为会不停地累加很多次,事实上加三次就爆了。INF一直习惯了用0X3F3F3F3F,这不好,特别是DP时状态转移需要累加的情况,应该弄得比可能的上界再大一点点就好了。或者你可以不停地判断,让值最高只能达到INF。 代码 #include #define maxn 10010 #define INF 10010 using namespace std; int N;原创 2016-09-20 21:31:26 · 357 阅读 · 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 · 812 阅读 · 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 · 377 阅读 · 0 评论 -
记忆化搜索,状压DP(20个问题,uva 1252)
要学会找到“决策”和“状态”。 在这题中,“决策”无非就是问哪个问题,而问过的问题就不能再问了,因此需要已问过哪些问题的“状态”。每次询问,无非得到两个结果,是或不是,所以还需要“状态”:问过的问题中,那些得到了肯定的回答。问问题的顺序不会影响结果,因此需要记忆化搜索。 状态转移方程: ans=min(ans,max(dp(s|(1 题目要求找最少问几次保证问出。 保证问出原创 2016-09-21 18:40:49 · 609 阅读 · 0 评论 -
动态规划(基金管理,uva 1412)
想了很久都没想明白为什么状态总数不超过13000种,找到了递推式,但觉得只能通过dp或枚举得到。 事先计算出所有可能的状态,然后构造一个状态转移表。 把程序每一个大的步骤都写在函数内,结构清晰。 频繁使用的函数封装起来,如update。 保存路径多开一个空间,这样找路径时就可以O(n)而不是O(n^2)。 递归倒序打印。 刷表法dp前要全部赋值一遍,代表从未访问过。 把一股的价格改为原创 2016-09-26 10:31:59 · 501 阅读 · 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 · 974 阅读 · 0 评论 -
记忆化搜索(跳舞机,uva 10618)
今天写了好久都没写出来,后来看别人代码才过了。 刚开始写的时候,觉得决策十分复杂,一直在讨论,写了很长。后来打印决策的时候遇到了更大的麻烦,只好用dfs递归去打印。代码长到爆炸,而且还WA了。 后来看别人代码,学到几个技巧。 在dp时直接暴力枚举所有决策,然后写一个函数判断是否合法即可。 能量消耗也不需要在dp时判断,直接交给函数处理就好了。 最开始之所以WA是因为路径保存错了。我只保存原创 2016-09-22 19:59:38 · 658 阅读 · 0 评论 -
区间DP(括号序列,uva1626)
发现动态规划,记忆化搜索,bfs之类的寻找最优解的算法,往往会有一些寻找最优解过程中的记录。通过观察这些记录,我们能寻到一些蛛丝马迹,从而找到最优解是如何一步一步形成的。因此可以打印决策过程,或者说可以还原我们是如何一步一步找到答案的,比如打印最短路径,又或者如此题中打印解。 以前BFS还能打印路径就觉得很神奇了。 今天碰到区间DP,用递归的方法还原路径,学到了。 关于记忆化原创 2016-09-19 17:22:35 · 565 阅读 · 0 评论 -
记忆化搜索,动态规划(巴比伦塔,uva 437)
#include #define INF 0X3F3F3F3F using 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 · 627 阅读 · 0 评论 -
记忆化搜索,动态规划(旅行,uva 1347)
看到这题想起了一个网络流的题目,就是说找两条不相交的路,使得总花费最短,解决办法是拆点法。 这道题用网络流做边太多了,估计不行。。。 #include #define maxn 1010 using namespace std; typedef long long ll; ll n; struct pt { ll x,y; }; pt PT[maxn]; double dp[原创 2016-09-16 21:04:57 · 389 阅读 · 0 评论 -
动态规划(Unidirectional TSP,uva 116)
dp里面sort用的好棒,我本来讨论了老半天的。。。 #include using 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 · 343 阅读 · 0 评论 -
01背包,恰好装满(劲歌金曲,uva 12563)
关于不一定装满与恰好装满: http://blog.sina.com.cn/s/blog_150cffdab0102w0g9.html 参考代码:http://blog.csdn.net/acvay/article/details/43601791 我的代码 #include using namespace std; int n,t; int dp[20000];转载 2016-09-18 20:18:51 · 832 阅读 · 0 评论 -
动态规划(照明系统设计,uva 11400)
参考资料:http://acm.lilingfei.com/uva-11400-lighting-system-design-%E4%BE%8B%E9%A2%989-6_138 只能往上换,不能往下换,电压最高的灯泡必须保留。 参考资料上证明了不能隔着换。 代码 #include using namespace std; struct bb { int V,K,C转载 2016-09-18 21:27:23 · 531 阅读 · 0 评论 -
动态规划(划分成回文串,uva 11584)
对每个位子进行DP时要先初始化一下他的值,这是就要考虑到有没有在接下来的循环中没能考虑到的边界情况,如果有,就在这些没有考虑到的情况中选一个最优解最为初始值,情况很少,往往判断一下就OK。如果没有遗漏的情况,那就给他赋一个一定会被替换的值,比如求最小值,你就给他赋INF,求最大值,你就给他赋-1或-INF。但要保证这个值一定会被替换,而且不会被认为是某个正确的结果。 #include u原创 2016-09-19 11:01:29 · 853 阅读 · 0 评论 -
动态规划(颜色的长度,uva 1625)
一开始用刷表法,每次都要memset,超时了。 然后改成填表法就过了。 AC代码 #include #define maxn 5010 #define INF 0X3F3F3F3F using 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 · 662 阅读 · 0 评论 -
区间DP(切木棍,uva 10003)
每次切割的费用等于被切割的木棍长度。 #include using 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 · 556 阅读 · 0 评论 -
数位DP(越大越好,uva 12105)
http://blog.csdn.net/keshuai19940722/article/details/25080553 学到一个小细节,调用strcpy(a,b)前一定要让a="\0"或者memset(a,0,sizeof(a))。 否则会出问题。 #include using namespace std; int n,m; int kase; char dp[110]转载 2016-09-26 16:55:44 · 636 阅读 · 0 评论