动态规划
GDUT_练意
这个作者很懒,什么都没留下…
展开
-
2017计蒜客第六场 微软大楼设计方案(困难)
思路: 排序+rmq+二分 按x排序,对每个关键部门 二分可以延伸的位置 (二分的时候判定条件要缩一下,因为h最大值为20,可以设判定为d -40 ),然后继续往右延伸到(大概d+40)就可以退出了, #include <iostream>#include<stdio.h>#include<algorithm>using namespace std;typedef long long原创 2017-06-04 21:27:50 · 390 阅读 · 0 评论 -
2017 计蒜之道 复赛 腾讯消消乐
官网题解 用f(mask,step) 表示考虑当前mask 集合内的数用 step 步删除完的方案数,每次转移则可以简单地用 O(n^2) 来进行枚举删掉的一段区间进行转移。 就是 记忆化搜索/dp递归会超时。还是能for循环就for循环。判断dp[S][step]+=dp[tmpS][step-1]能否转移的小小优化。 可以枚举所有i~j预处理所有状态能不能消除,转移的时候O(1)判断(在代码中原创 2017-06-11 21:05:36 · 421 阅读 · 0 评论 -
HDU 5025 Saving Tang Monk
没有利用题目所造成的key的特殊性质,结果–比赛的时候和蛇一起状态压缩超内存。 int dp[][][][] -> setdp[][] 试图这样做,减少空间的浪费 结果超时. 用优先队列的搜索到达结果后可直接:return s.t;否则应该: res=min(res,s.t );优先列队下可以有这个剪枝if(s.t<vis[s.x][s.y ][s.s1 ][s.s2 ]){原创 2016-08-08 22:41:53 · 272 阅读 · 0 评论 -
poj 2137 Cowties
includeincludeincludeincludeincludeusing namespace std; typedef long long ll; const int maxn=100100; const double INF=100000000; double dp[110][50];double dist(double x1,double y1,double x2,double转载 2016-07-18 21:12:03 · 214 阅读 · 0 评论 -
1113 Wall
#include<stdio.h>#include<string.h>#include<algorithm>#include<vector>#include<cmath>using namespace std;typedef long long ll;const int maxn=100100;const double PI=acos(-1.0) ; int n; doubl转载 2016-07-18 21:10:04 · 192 阅读 · 0 评论 -
poj 2288Islands and Bridges
#include<stdio.h>#include<string.h>#include<algorithm>#include<vector>#include<cmath>#include<iostream>using namespace std;typedef long long ll;const int maxn=100100;typedef long long ll;int w转载 2016-07-18 21:08:51 · 251 阅读 · 0 评论 -
HDU 5135I - Little Zu Chongzhi's Triangles
http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意: 给n(n<13) 条边,你可以任意组合成多三角形,求面积和最大。 关键是想到它是状态压缩dp ,枚举C (12,3) 枚举不完,n<13可以完全在(int)二进制的压缩范围内。接下来就是dp 三要素了 初始: 这题简单, 面积为零 转移: dp[s&v] = max(dp[s&v],dp转载 2016-07-14 09:07:08 · 205 阅读 · 0 评论 -
poj 2152树形dp
最大的bug就是这里 for(int jj=1;jj<=num[rt];jj++){ tem[jj]=dp[rt][jj]; } for(int j=1;j<=num[rt];j++){ for(int k=0;k<=j;k++){ //dp[i][j]=max(dp[i][j],dp[i][j-翻译 2017-01-07 11:43:31 · 260 阅读 · 0 评论 -
poj 1947 树形dp
别人的思路for(int j=n-1;j>=0;j--){ for(int k=1;k<=n-j;k++){ dp[rt][j+k]=min(dp[rt][j+k],dp[rt][j]+dp[son][k]-1); } }因为j 是递减的, 更新后的 dp[rt][j+k],没有机会成为 dp[rt][翻译 2017-01-07 16:41:37 · 264 阅读 · 0 评论 -
分组背包 hdu 1712
枚举的时候 用一组的物品去刷新一个重量,有种每组物品只选一次的感觉 dp[k+1][j]=max{dp[k+1][j],dp[k][j],dp[k][j-i]+A[k][i]};#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<cmath>#include<iostream>usi原创 2017-01-08 12:24:54 · 237 阅读 · 0 评论 -
分组背包hdu 3033 至少选一个
感谢某神的提供的数据。 关键还是自己不够细心, b==0? 这题的状态转移细节很多 首先1.如何保证每组物品都至少选一个——> dp[][]置空,dp[1][0]置0. 从第k组,转移到第k+1组的时候,去掉o1背包常见的那种不选的继承状态->(dp[k+1][j]=dp[k][j])最主要的状态方程如下 dp[k+1][j]=max(dp[k+1][j],max(dp[k][j-w[i]]+原创 2017-01-08 14:16:57 · 529 阅读 · 0 评论 -
分组背包 poj 1837
此题的最大bug 就是时间复杂度计算错误 20*20? 、、、、、25*15*20*20此题的特点是每组“有且仅有一个” 组与组之间的转移 dp[k+1][j+v[k][i]] += dp[k][j] 这个保证了 每组有。 for(组别){ for(重量){ for(组内每件物品){ 这样的枚举顺序保证了 每组仅有一个 重量的逆原创 2017-01-08 17:04:36 · 318 阅读 · 0 评论 -
01背包 poj3211 STL助攻
bug一开始头昏脑胀把dp[0]的值赋值为1#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<cmath>#include<iostream>#include<map>#include<string>using namespace std;typedef long long原创 2017-01-08 17:56:48 · 283 阅读 · 0 评论 -
uvalive 7834 状态压缩dp
题目描述: 一个人打怪,一共有不超过8瓶药,人有两种属性,一个是力量,一个是血液中毒的浓度,初始力量为100,毒浓度为0,药能增加力量,但不能超过100,药也能加大毒的浓度,不能大于等于100,怪的属性都是一样的,打死一只怪物你需要力量减去一个定值,毒的浓度也会减去一个定值,但是你的力量不能减低至0,毒浓度也不能降低至负数,打死一只怪之后你可以喝不超过一瓶药,假设怪数量无限,求能打死多少只怪。设f原创 2017-07-12 22:05:19 · 286 阅读 · 0 评论