动态规划
文章平均质量分 69
丿Smile灬晨星
这个作者很懒,什么都没留下…
展开
-
Codeforces581F
参考代码及简单注释:#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef lon原创 2015-10-14 15:58:11 · 648 阅读 · 0 评论 -
hdu4332 状态压缩+矩阵快速幂
首先将状态减半,奇数状态都为不合法状态,再将前31位状态打标,最后再对n按位累乘。ACcode:#include#includetypedef long long LL;const int NS=8;const int MS=1<<NS;const int MSK=MS>>1;const int MOD=1000000007;struct matrix{原创 2013-07-15 18:24:42 · 1100 阅读 · 2 评论 -
poj3311 哈密顿回路
简单题,蓦然回首,第一次做这个题还是看解题报告的状态转移前后写了一个多小时才搞定的,练了这么多题目之后,效果还是很明显的。ACcode:#include#includeconst int NS=12;const int INF=1<<30;int n;int g[NS][NS];int dp[1<<NS][NS];int Min(int a1,int b1){原创 2013-07-15 15:25:37 · 960 阅读 · 0 评论 -
poj2441 状态压缩~放置方案数
一开始想到O(n*m*2^n)的算法,马上就否定了,觉得会超时,应该想一个O(m*2^n)的算法,想来想去似乎没办法,去百度看了看,发现基本上都是水过去的,那我也只能跟随大众加入水军。写了两种算法,一种用滚动数组写的,时间600+,还有一种用背包写的,时间1100+,不过空间只有一半。ACcode:#include#includeconst int NS=20;int n原创 2013-07-15 17:24:13 · 873 阅读 · 0 评论 -
poj3254 棋盘覆盖~方案数
很简单的题目,先把状态转移预处理,再DP。ACcode:#include#includeconst int NS=12;const int MS=1<<NS;const int MOD=100000000;int n,m,x,y;int pre,now,lim,res;int g[NS],dp[2][MS];int state[1000000][2],top;原创 2013-07-15 01:17:18 · 896 阅读 · 0 评论 -
poj3229 哈密顿回路
很简单的题目,先将路径floyed处理,然后状态压缩DP即可。ACcode:#include#includeconst int NS=15;const int MS=1<<NS;const double INF=1e12;int n,m,x,y,f;int ms,lim,res;int dt[2]={80,120};double tmp,k,z;dou原创 2013-07-15 00:15:05 · 950 阅读 · 0 评论 -
poj 2288 状态压缩~最优值+方案数
题目并不难,用三维分别表示最后一个节点,倒数第二个节点以及经过的点集,然后直接往后递推,方案数统计的时候不知道有没有重边,直接开二位数组记录边数,方案数会超int。ACcode:#include#includetypedef long long LL;int const NS=13;int n,m;int v[NS];int dp[NS][NS][1<<NS];in原创 2013-06-09 14:38:02 · 675 阅读 · 0 评论 -
hdu2167 状态压缩~最优值
做过hdu1565,这题写起来就很简单了,先把状态dfs出来,再把图预处理好,然后直接两层循环搞定。ACcode:#include#includeint const NS=15;int const INF=1<<30;int n,lim,top,res;int g[NS][NS],dp[2][1<<NS];int state[1<<NS][2],num[NS][原创 2013-06-17 18:14:51 · 798 阅读 · 0 评论 -
uva11008 状态压缩~最优值
题目大意是给n个点,去点至少m个点,最少需要几条直线。首先,将在一条直线上的点预处理出来,然后从0开始加状态,只要状态中1的个数>=m就作比较。ACcode:#include#include#includeusing namespace std;const int NS=1<<16;const int MS=20;struct Point{ int x原创 2013-06-07 15:09:21 · 806 阅读 · 0 评论 -
hdu4281 状态压缩~MTSP最优值
一开始很简单的以为跟之前写的一样,多加个就可以了,第一问确实没问题,第二问就错的离谱了,看了网上的解题思路,果断自己写了一个,代码写得比较搓,不过时间复杂度还可以。ACcode:#include#include#include#includeconst int NS=15;const int INF=1<<30;struct Point{ in原创 2013-06-17 01:09:32 · 922 阅读 · 0 评论 -
hdu4568 状态压缩~最短路径
做过一个类似的,求最短路径有点纠结。ACcode:#include#include#include#includeusing namespace std;int const NS=210;int const MS=14;int const INF=(1<<30);struct Node{ int x,y,v; bool operator<(co原创 2013-06-06 20:55:11 · 1192 阅读 · 0 评论 -
SGU132 状态压缩~最优值
看了一天,然后由于各种事情一直没写,今天搞了一下午才搞出来,每次存两行的状态,保证now状态之前的行满足条件。ACcode:#include#include#includeusing namespace std;const int NS=80;const int MS=10;const int MAX=7000;int n,m,c,sj,sx;char st原创 2013-06-06 18:38:42 · 898 阅读 · 0 评论 -
hdu3920 状态压缩~最优值
优化:先排序,再去重。ACcode:#include#include#include#includeusing namespace std;const int NS=20;const double INF=1000000000.0;const double eps=1e-8;struct Point{ double d,x,y; bool原创 2013-06-15 00:09:05 · 939 阅读 · 0 评论 -
hdu4570 区间DP
很简单的区间DP,坑爹的题目坑了无数Wrong进去,最后还是看了网上的解题思路才发现题目读错了,改了一下就ok了。ACcode:#include#include#includeusing namespace std;typedef long long LL;const int NS=200;const LL INF=(1LL<<62);LL sum,t;LL a[原创 2013-06-15 15:32:20 · 891 阅读 · 0 评论 -
hdu4284 状态压缩~最优值
直接用循环写的,时间稍微有点多,只求出一个可行方案即可,dfs肯定更优。ACcode:#include#includetypedef long long LL;const int NS=16;const int MS=110;const int INF=1<<30;int n,m,h,monkey;LL g[MS][MS],dp[1<<NS][NS];int bi原创 2013-06-13 18:35:52 · 803 阅读 · 0 评论 -
hdu4049 状态压缩~最优值
题意看了半天,还是去百度找中文题意确认了一下,清楚之后题目很简单,代码实现也不是很麻烦,只是位运算有点纠结,犯了几个小错误。调了2小时,还能说什么呢。似乎G++快一倍,C++交上去先是TML,再交上去984MS,实在没心思去优化了,就先这样吧。ACcode:#include#includeconst int NS=10;const int INF=1<<30;int原创 2013-06-13 14:35:10 · 1091 阅读 · 0 评论 -
hdu3091 状态压缩~方案数
一开始想到2^n*n^2算法,感觉肯定会超时,纠结半天之后没办法,去百度才发现大家都是这复杂度,然后兴致匆匆开始敲,敲完之后wrong了,再接再厉调了一下再交,结果给我几个TML,我就郁闷啦,为什么RP这么低,只好再优化一下,把每个状态的1用数组存起来,交上去还是wrong,想了想似乎会超int,改成int64再交就过了,前后搞了一个多小时,真心郁闷啊,说实话感觉像水过去的。ACcode:原创 2013-06-12 18:06:04 · 689 阅读 · 0 评论 -
hdu3006 状态压缩~方案数
很简单的题目,将集合压缩成一个数,两重循环搞定。ACcode:#include#includeconst int NS=15;int n,m,k,t;int v[1<<NS],a[111];int main(){ while (~scanf("%d%d",&n,&m)) { for (int i=0;i<n;i++)原创 2013-06-12 16:22:32 · 672 阅读 · 0 评论 -
poj1170 状态压缩背包
看到题目就想到5维背包,不过想了想状态转移要5层循环,写起来相当痛苦。也没想到6进制,看了一下讨论说用六进制,想了一下似乎还真是这样,状态转换好写起来就简单,直接背包就可以。ACcode:#include#includeconst int NS=6;const int MAX=7776;const int INF=1<<30;struct offer{原创 2013-07-16 01:59:56 · 947 阅读 · 0 评论 -
poj1691 状态压缩~最优值
一开始题意理解成颜色不懂不相连就要换笔,各种Wrong之后去百度就发现自己SB了,把建图改了一下就AC了。ACcode:#include#include#includeusing namespace std;const int NS=15;const int INF=1<<25;struct Rectangle{ int x1,y1,x2,y2,ty;原创 2013-07-16 23:47:24 · 876 阅读 · 0 评论 -
zoj3905
dp[i][j]表示前i个Cake中,有j个属于Alice,显然需要保证 i - j >= j 也就是 2*j 状态转移 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + p[i].a)首先按b从大到小排序去除后效性,1、dp[i - 1][j]转态转移到dp[i][j]的时候(第i个Cake给Bob),由于i后面的Cake的b都是小于p[原创 2015-10-12 16:47:01 · 987 阅读 · 0 评论 -
Spoj SPOJ - KPSUM
数位dp第一弹#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef lo原创 2015-10-07 17:45:11 · 471 阅读 · 0 评论 -
hihoCoder1090 Highway
参考代码:#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const LL LINF = (1LL <<63);const int IN原创 2015-09-28 17:09:04 · 643 阅读 · 0 评论 -
Poj 3377 区间DP
预处理消除后效性。ACcode:#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int NS=1000010;const LL INF=(1LL)<<62;c原创 2013-11-05 12:41:44 · 894 阅读 · 0 评论 -
Codeforces 360C - Levko and Strings 组合数学+DP
纠结了两天才差不多明白原理 顿时觉得自己弱爆了。。。贴上自己的理解,统计时怎么分类想明白基本就ok了Accode:#include#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int NS=2010;原创 2013-11-15 13:35:32 · 970 阅读 · 0 评论 -
hdu4123 树形DP+RMQ
先求每个点的最远路,然后用RMQ维护队列求解。ACcode:#include#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int MS=18;const int NS=50010;const i原创 2013-10-29 13:21:05 · 608 阅读 · 0 评论 -
SGU131 状态压缩~覆盖方案数
做这个题前前后后磨了3天,感觉自己弱爆了;总算理解好了,不过收获也很大,发现之前状态理解错了,做这个题的时候,发现论文里面的状态转移完全无法理解,然后去找各种解题报告,让我恍然大悟的一句话是:“因为已经做到了第i行,那么i-1行一定要求是满的。”,这是在Wrongswer空间看到的一句话,对于dfs中pre,now状态转换顿时就明白了。而且这个解题报告状态的解释也很清楚,值得一看。为了加深自己的理原创 2013-05-22 21:40:15 · 1265 阅读 · 1 评论 -
hit1402 各种整数划分
1) 将n划分成若干正整数之和的划分数。2) 将n划分成k个正整数之和的划分数。3) 将n划分成最大数不超过k的划分数。4) 将n划分成若干奇正整数之和的划分数。5) 将n划分成若干不同整数之和的划分数。ACcode:#include#includeconst int NS=55;int n,m;int dp[5][NS][NS];void原创 2013-08-09 18:23:24 · 767 阅读 · 0 评论 -
hdu4661 树形DP
这次被虐残了,很好想的树上统计拓扑排序数,比赛的时候找儿子节点循环判断有一个很恶心的错误,一直到比赛结束都没找出来。ACcode:#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#includeusing na原创 2013-08-09 03:36:44 · 827 阅读 · 0 评论 -
hdu4652 概率DP
比赛的时候题目都看不懂,感觉被虐残了!今天搞了一下午加一晚上终于把它搞定了,概率这东西不是一般人能玩的啊!ACcode:#include#include#includeconst int NS=1000010;int n,m,op;double ans;double det[NS];int main(){ for (int T;~scanf("%d",&原创 2013-08-08 00:44:39 · 799 阅读 · 0 评论 -
hdu4634 搜索+状态压缩
很好的搜索,写起来条件考虑很多很繁琐,交上去各种自挂东南枝,最后写了个数据生成与标称对拍查错,搞了2小时总算AC了。ACcode:#include#include#includeusing std::min;const int NS=222;const int MS=9;const int INF=0x3f3f3f3f;struct node{ int x原创 2013-08-03 16:09:32 · 762 阅读 · 0 评论 -
hdu4616 树形DP
多校第二场了,被打击的遍体鳞伤啊,比赛结束的时候看了这题,一眼就想到树形DP,真正写起来才发现原来这么麻烦,状态合并有一部分要去局部最优,只好加了一维状态记录当前节点往下i次trap且以trap值为1的节点结尾的最优值。题目不算很难,细节调起来很纠结。原创 2013-07-26 04:23:34 · 1130 阅读 · 2 评论 -
poj1160 区间DP
经典区间DP,O(n^3)复杂度,不知道有没有优化。ACcode:#include#include#includeusing namespace std;const int NS=305;const int INF=0x3f3f3f3f;int n,m;int p[NS],dp[NS][NS],s[NS][NS];int main(){ wh原创 2013-07-22 01:32:41 · 599 阅读 · 0 评论 -
poj 2285 状态压缩~最优方案
很纠结的题目,思路不是自己想出来的,技巧也是借鉴过来的,没想过搜索可以这样剪枝,不过还真学到些技巧。写dfs时用了一个全局变量导致程序异常,恁是调了两小时才揪出来,那是相当的郁闷啊。ACcode:#include#include#include#include#includeusing namespace std;const int W=5;const int MS原创 2013-07-20 16:41:50 · 981 阅读 · 0 评论 -
poj 3903 最长上升子序列
整理模板,经典题型。ACcode:#include#includeconst int NS=110000;int c[NS],n;int st[NS],top;int LIS(int len,int a[]){ st[top=1]=a[1]; for (int i=2;i<=len;i++) if (a[i]>st[top]) st[++top原创 2013-07-21 17:01:29 · 883 阅读 · 0 评论 -
poj2430 状态压缩DP
很早之前就看了这题,觉得写起来比较麻烦,放了一段时间今天还是忍不住又看了一遍,调了一下午感觉不会再AC了,吃了晚饭回来听歌小情歌,改了初始化然后就过了。。。过了,有点受宠若惊。ACcode:#include#include#includeusing namespace std;const int NS=1100;const int INF=1<<30;struct n原创 2013-07-17 22:13:46 · 669 阅读 · 0 评论 -
poj2836 状态压缩~矩形覆盖
首先预处理每两个点为顶点包含的点集合,然后往后直接DP。ACcode:#include#includeconst int NS=15;const int INF=1<<30;int n,lx,rx,uy,dy,lim;int g[NS][NS],ar[NS][NS];int x[NS],y[NS],dp[1<<NS];int Max(int xa,int xb)原创 2013-07-17 02:14:55 · 1327 阅读 · 3 评论 -
hdu 3001 状态压缩~最优值
一开始的想法是将n个点扩充成2n个节点,复杂有2k万,感觉有点高,静下心想了一下,感觉可以用三进制表示状态,发现确实可以,初始化没写好,郁闷了半小时。ACcode:#include#includeconst int NS=11;const int LIM=600000;const int INF=(1<<30);int n,m;int g[NS][NS],p3[NS原创 2013-06-10 11:55:01 · 732 阅读 · 0 评论 -
hdu4571 背包
先对景点排序,然后按顺序背包,对初始结束节点特殊处理一下。ACcode:#include#include#includeusing namespace std;typedef long long LL;const int NS=210;const int INF=10000;struct node{ int id,c,va; bool opera原创 2013-06-10 10:49:36 · 887 阅读 · 0 评论 -
hdu 1054 树形背包
很简单的题目。一开始看错题目了,误以为每个士兵可以守住相邻的节点,将状态方程改了之后,分别记录当前节点派不派士兵的最优值。ACcode:#include#includeconst int nsize=15555;int n,p,s,k,d0,d1;bool v[nsize];int head[nsize],next[nsize<<1],e[nsize<<原创 2013-03-09 11:44:06 · 706 阅读 · 0 评论