动态规划
文章平均质量分 67
未水
这个作者很懒,什么都没留下…
展开
-
POJ 1925 dp
太挫了,又是从别人那里偷来的代码因为一开始想枚举楼dp,但一直无法解决后效性,到达一高楼的次数一样但甩开到达右边的横坐标不一样而且题意没有理解到,高度在h[1]时才转移到下一高楼这一题告诉我们枚举坐标也是有可能的,再加适当剪枝也许能实现还有个坑:数组要开两倍大小,因为甩开到达右边相当于镜面对称#include #include #include #include #in原创 2013-04-23 00:28:46 · 847 阅读 · 0 评论 -
zoj 3725 DP排列
DP计数,有限制性条件下的计数无法直接推公式,一般含有重复,无法完全吻合这时选择dp,调用前面算出的结果 (two[i-m-1]-dp[i-m-1])用的妙!#include #include #include using namespace std;#define ll long long#define mod 1000000007#define N 100500原创 2013-07-16 20:05:53 · 993 阅读 · 0 评论 -
hdu 4616 经典树形dp 多校第二场
#include #include #include #include using namespace std;#define N 50500int trap[N],val[N],n,C,vis[N],ans;int dp[N][5][2];vectorvec[N];void DP(int u){ vis[u]=1; dp[u][trap[u]][0]=dp[原创 2013-07-29 21:18:10 · 1468 阅读 · 1 评论 -
hdu 4640 多校第四场 状态压缩+最短路+dp
应该注意到n很小,说明我们可以位压缩处理每种状态预处理出一个人从1出发,已经走到哪些点(用状态记录),最后到达哪个点的最小花费,用广搜spfa之后i个人走,是一个人的效果的i次叠加,用类似背包的过程,注意要从大到小枚举状态,避免转移重复,dp标程错了,它处理成不能回到1,我wa了很久,主要手写队列搞挫了。。。开始时不会做是因为看不到问题的本质,本质就是搞出一个人时候的最短路,然后d原创 2013-08-03 20:06:52 · 1129 阅读 · 0 评论 -
hdu4689 多校第九场 dp
dp[i][j][k] 到前i个符号时,前面有j个-,k个还需要改变+,dp[len][cnt(-)][0] 即为答案当前dp到第i位,1.如果当前是-,必须从前i位转移一个过来,1.1转移那些+1.2转移那些必须是+但现在还没有变成+的2.如果当前是+,它要变成+必须后面的比它大的数来转移它,所以记录k+12.1转移那些+2.1转移那些必须是+但现在还没有变成+的原创 2013-08-21 08:40:24 · 1122 阅读 · 0 评论 -
hdu 4652 经典概率题+公式推导
#include #include #include #include #include #include #include using namespace std;typedef complex dcomp;dcomp s[1000040];int main (){ int T;scanf("%d",&T); while(T--) {原创 2013-08-11 16:39:00 · 1109 阅读 · 0 评论 -
poj 2778 经典 AC自动机+dp
http://blog.henix.info/blog/poj-2778-aho-corasick-dp.html 讲得很好1.当要转移的次数很多,有牵涉到很多关系时,用矩阵2.fail指针的理解用数组的写法更容易理解#include #include #include using namespace std;#define mod 100000#define CH原创 2013-09-06 01:04:49 · 790 阅读 · 0 评论 -
codeforce Round201 div1 B. Lucky Common Subsequence KMP+DP
这种包含或不包含某串总是dp+KMP或者AC自动机,dp的状态包含KMP或者AC自动机的状态,然后利用fail指针实现转移求KMP,在普通的最长公共子序列加一维记录匹配的状态dp[i][j][k]记录A的i位置和B的j位置时匹配到virus的k状态的答案有多少个wa的原因1.如果初始化,只初始化dp[0][0][0]=0是不对的,其实本题不初始化,全部都为0没问题2.不知道怎么原创 2013-09-30 12:50:07 · 1411 阅读 · 1 评论 -
sgu 422 Fast Typing 概率题DP
d[i]表示从i到n正确完成的最小期望倒着推,考虑到从i之后的某状态又能回到iP(i,j)=(1-a[i])*(1-a[i+1])*...*(1-a[j])方程:d[i]=min{ (k-i+1)+t+sigma( P(i,j-1)*a[j]*(k-j+1+d[j]) )+sigma( P(i,j)*d[i+1] ) } (i+1移动到某位置k(k在i~n)之后看屏幕,返回i~原创 2013-10-06 20:40:07 · 1163 阅读 · 0 评论 -
hdu4758 AC自动机+dp
不用AC自动机的话,怎么dp,推公式都会交叉,都会重复,只有用AC自动机分离出一个个匹配的状态才能解决此题是poj2778 DNA sequence的弱化版1.对自动机上每个状态dp,dp[a][b][c][d]表示经过了a个字符,匹配了b个R,在c这个状态,d是4进制数,表示是否经过串1和串2trie树上其实代表一种转移关系,即当前匹配了i个字符,遇到i+1个字符会转到哪个状态2原创 2013-09-23 23:12:02 · 1199 阅读 · 0 评论 -
POJ 1947 树形dp
知道树形dp肯定是节点与它的子节点的方程想到dp[i][j]记录的是“以i节点为根”(不仅仅是包含i节点)的子树包含j个点的答案刚开始没想到要以i节点为根记录状态,始终联想不到它和子节点的关系然后被坑到的是这是一棵有根树,边是有向的!!偷来的代码,构造的好简洁啊!!orz……很好的解决了初始化问题#include#include#include#include#incl原创 2013-04-17 20:58:28 · 597 阅读 · 0 评论 -
SGU 492 经典数位dp
计数时不要某个数字,求数字对应的序号或者求某个序号对应的数字解决方式是记忆化搜索long long 是肯定的,并注意n最大时对应的答案的范围原来1000000000000000000 #include #include #include #include #include using namespace std;#define ll long longll原创 2013-04-28 04:14:16 · 1032 阅读 · 0 评论 -
POJ 3034 简单dp--注意细节
没考虑到锤子可能到达界外一直不过,从界外也能转移进来,并可能得到更优的结果想法是简单的,从前一秒的每个状态转移到下一秒的每个状态,状态数比较小,能过在处理经过时得到几分比较山寨,凑合着吧。。#include #include #include #include #include using namespace std;#define eps 1e-8int n,d原创 2013-04-25 19:16:02 · 685 阅读 · 0 评论 -
POJ 2411 记录状态的dp
和poj3254一样#include#include#include#include#include#include #include #include #include #include using namespace std;#define ll long longll dp[(1<<12)+100][13];int h,w;ll dfs(int i,int原创 2013-04-18 16:59:18 · 578 阅读 · 0 评论 -
hdu 1003/poj 1050 连续子序列最大和经典基础dp
之前不太理解,只记得和为负的就记为0,然后不断扫下去,更新ans实际上用了 sum[i]-sum[j] ,令ans最小,即找出最大的sun[j](jhdu1003 还要求出起始点和终点#include #include #include #include #include using namespace std;int dp[100500],n;原创 2012-10-15 13:22:55 · 1389 阅读 · 0 评论 -
POJ 1185 经典dp
开始居然题目都理解错了,两个兵攻击范围重叠是允许的思路都是错的,其实就是按经典的想法,解除后效性就要把相关的会影响后面的状态对应的答案都记录下来然后就是状态压缩,学习了!!又是偷来的代码,我太挫了!//#include //#include //#include //#include //#include //using namespace std;//int n,d,原创 2013-04-25 16:50:41 · 628 阅读 · 0 评论 -
POJ 2948 经典二维dp
一开始不知道怎么解决后效性,以为自己记录状态的方式错了,实际上是转移方程想错了学习了:如果怎么dp都发觉有后效性,一定是dp的姿势不对dp[i][j] 如果采用向左的决策,要从dp[i-1][j] 转移过来,如果采用向上的决策,要从dp[i][j-1]转移过来,这样前面的方程里怎么决策才不会对后来那个方程有影响#include#include#include#includ原创 2013-04-18 18:23:10 · 668 阅读 · 0 评论 -
POJ 3280 dp
经典二维dp,dp[i][j]的状态是由dp[i+1][j], dp[i][j-1], dp[i+1][j-1]推出来的,找出关系就好首先要反应到状态记录的是每个子串,然后想每个状态是由哪些状态推出来面对每种状况有哪些决策,这些决策就对应着转移方程最后考虑用来更新的状态值必须是已经更新好的#include#include#include#include#include#i原创 2013-04-17 13:33:42 · 741 阅读 · 0 评论 -
POJ 2029 预处理
水题#include#include#include#include#include#include #include #include #include #include using namespace std;#define N 105int down[N][N],ver[N];int mat[N][N];int main (){ int n,w,h,s,原创 2013-04-16 23:05:46 · 776 阅读 · 0 评论 -
poj 2057 树形dp
主要是在策略选择上:对于一个节点,它该先往哪个子节点走比较它的两个子节点u和v:房子在u这边的概率为num[u]/ num[1] ,房子在v这边的概率为 num[v]/num[1],分别简化为num[u] ,num[v]先选u:num[u]*go[u] + num[v]*(fail[u]+2+go[v])先选v:num[v]*go[v] + num[u]*(fail[v]+2+go[u原创 2013-03-31 13:47:32 · 636 阅读 · 0 评论 -
poj 1191 dp经典
#include #include #include #include #include #include using namespace std;int dp[20][10][10][10][10];int s[10][10][10][10];int mat[10][10];int n;int cal(int k,int x1,int y1,int x2,int y2)原创 2013-03-26 17:19:20 · 784 阅读 · 0 评论 -
hdu4301 状态dp
#include #include #include #include #include #include #include using namespace std;#define N 1050#define mod 100000007int dp[N][N*2][2];int main (){ memset(dp,0,sizeof(dp)); dp[1][原创 2013-03-13 17:35:08 · 683 阅读 · 0 评论 -
CF401-D dp的好题
dp[i][j] 表示状态i(用到了哪些数字)下的数字组合中,模m余j的个数有多少个,想清楚为什么能用i表示算出所有答案vis[i][j][k] 表示状态i下余j的情况下,下个数字是k,它叠加了没,必须为bool,会暴内存,因为数字中可能有重复,如果不标记可能被叠加多次抄别人的代码#include #include #include #include #include #in原创 2014-03-16 11:36:43 · 1005 阅读 · 0 评论