动态规划
撒旦即可
研究CV的菜狗
展开
-
HDU4283(区间dp)
题目大意:一些屌丝排队进场,第k个进场的人后又k-1*a[i]的愤怒值,为了得到最小的愤怒值,可以利用一个栈来调整顺序,第i个人进栈可以让第i+1个人先行入场,对于栈里的元素必须是后进先出,问如何合理利用栈来以得到最小的愤怒值。解题思路:我们用dp[i][j]表示区间i~j之中的元素可得到的最小的愤怒值。对于i~j中的元素i我们然他第k个入场,那么其后面的k-1个元素就要先行入场, ...原创 2019-03-16 08:38:19 · 322 阅读 · 0 评论 -
HDU1520(树形dp入门)
解题思路:https://blog.csdn.net/yexiaohhjk/article/details/52694214设dp[i][0]表示:当前这个点不选,dp[i][1]表示当前这个点选择的最优解。转移方程:dp[cur][0]+=max(dp[son][1],dp[son][0]);//当前这个点不选,那他的孩子可选可不选,取最大的。dp[cur][1]+=dp[son...原创 2019-03-16 10:45:43 · 186 阅读 · 0 评论 -
HDU4283(简单概率dp)
解题思路:dp[i][j]表示以(i,j)为起点到终点(n,m)所需要的步数。dp[i][j]=(dp[i][j]*p0+dp[i][j+1]*p1+dp[i+1][j]*p2+2)经过化简可得dp[i][j]=(dp[i][j+1]*p1+dp[i+1][j]*p2+2)/(1-p0)也就是程序中的dp表达式#include<cstdio>#include<cstr...原创 2019-03-16 09:47:24 · 213 阅读 · 0 评论 -
HDU5489(LIS最长上升子序列)
解题思路:删除后会把数列分为左半端,和右半段。这里就是假设右半段的上升序列是以右半段第一个数开始的,那么相应的左半端的上升序列的最大数就应该小于右半段第一个数。所以就拿着右半段的第一个数用二分搜索去左半端找,找到符合要求的上升序列,然后记录一下长度即可。#include<cstdio>#include<cstring>#include<algorithm&g...原创 2019-03-15 23:56:02 · 278 阅读 · 1 评论 -
poj1836(LIS的二分写法,模板)
解题思路:以前一直没有试过LIS的二分搜索写法,复杂度只有O(nlogn)。这道题的思路也是很明确,输入的数组从左向右做一遍LIS dp,再从右向左做一遍LIS。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace st...原创 2019-03-15 22:13:23 · 91 阅读 · 0 评论 -
HDU3586(树形dp)
解题思路:这道题一看要求最大值的最小值,就感觉像是用二分法来列举边的限制lim。然后接下来用树形dp求规定lim下,最小总费用有没有超过m即可。但做这道题的时候,因为二分法的书写问题,导致一直WA。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>...原创 2019-03-20 09:39:18 · 196 阅读 · 0 评论 -
HDU3092(改编完全背包问题)
解题思路:详见https://blog.csdn.net/acm_cxq/article/details/51626668#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 3008#define ll long longusing...原创 2019-03-15 17:23:53 · 213 阅读 · 0 评论 -
poj3140(树形dp)
解题思路:题目大意就是一棵树去掉一条边,得到树两边的差值最小。典型的dfs树形Dp#include<cstdio>#include<cstring>#include<algorithm>#define N 100009#define inf 0x3f3f3f3f#define ll long longusing namespace std;...原创 2019-03-20 00:22:55 · 186 阅读 · 0 评论 -
hdu4586(概率)
解题思路:假设最终的数学期望是x,则可得方程x=sum/n+x*m/n化简后为x=sum/(n-m)。要注意两个特殊情况,即sum==0&&n-m==0时x=0,只有n-m==0是x=inf。#include<cstdio>#include<cstring>using namespace std;int a[300],b[300];int ma...原创 2019-03-20 21:28:34 · 148 阅读 · 0 评论 -
HDU5001(概率dp经典)
解题思路:反正hduoj跑10^8级大概850ms左右,搞不好会超时。一开始想这道题感觉10^8可能会超时,但奇迹没超。题目求的是每一个点在d步中没有一次经过的概率。这个也就是求除这个点以外,到其他点的概率。#include<cstdio>#include<cstring>#include<vector>#include<iostream>...原创 2019-03-20 22:43:50 · 226 阅读 · 0 评论 -
图论邻接举证的应用
一个图的邻接矩阵为A则A^n中,A[i][j]表示的是从i出发走到点j走n步,有多少种走法可以有两种用法1。判断n步以后能不能走到,复杂度为O(n^3)2.我觉得概率Dp中也可以用来计数,就是复杂度还是O(n^3)...原创 2019-03-20 22:49:14 · 211 阅读 · 0 评论 -
HDU4804(插头dp/轮廓线dp)
题意:题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,最后铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法。解题思路:对比了一下网上的写法,花了1500Ms,我的花了3000ms。主要还是因为位运算多了一些,回头试试简化一下。转移方程见代码注释。#include<bits/stdc++.h>#define ll long longusi...原创 2019-05-13 21:32:27 · 231 阅读 · 0 评论 -
HDU2829(斜率优化dp,模板)
解题思路:以下分析摘自:https://blog.csdn.net/xingyeyongheng/article/details/26009171假定dp[i][j]表示前i个数分成j段的最小值cost[i]表示从1~i的数两两相乘的总和sum[i]表示前i个数的和则:dp[i][j]=Min(dp[k][j-1]+cost[i]-cost[k]-sum[k]*(sum[i]-s...原创 2019-03-26 20:05:54 · 252 阅读 · 0 评论 -
HDU3507(斜率优化dp 入门)
解题思路:第一次做斜率优化dp,参考了博客http://www.cnblogs.com/kuangbin/archive/2012/08/26/2657650.html。使原本O(n^2)的复杂度变成O(n)。看完博客之后,看了一下代码发现代码中(yj-yk)/(xj-xk) <= sum[i],只要碰到一个不符合这个条件就用j来算dp[i]了。其实是这样的,因为符合上面那个不等式,代表j在...原创 2019-03-23 10:24:14 · 246 阅读 · 0 评论 -
HDU4632(区域dp)
解题思路:求一个字符串中的回文子串个数。要注意因为是要取余的,所以dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]可能是负数,所以还要+mod来确保它是正数。以下摘自https://blog.csdn.net/u014492306/article/details/45243649用dp[i][j]表示这一段里有多少个回文串,那首先dp[i][j]=dp[i+1][j]+...原创 2019-03-19 11:48:47 · 177 阅读 · 0 评论 -
poj2955(区间dp,括号匹配)
解题思路:状态转移方程为dp[i][j]表示第i位和第j位字符间匹配数当s[i]匹配s[j]时 dp[i][j]=dp[i+1][j-1]+2然后 还有一部不论匹不匹配,都要dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j])#include<cstdio>#include<cstring>#include<...原创 2019-03-19 11:16:05 · 560 阅读 · 0 评论 -
HDU3506(区间dp+四边形不等式优化)
解题思路:其实这道题对于区间dp来说还是常规的,但是常规做法有O(n^3)的复杂度。所以出现了一个没有听过的优化方法——四边形优化。具体证明详见一下两篇博客:https://www.cnblogs.com/mlystdcall/p/6525962.htmlhttps://blog.csdn.net/noiau/article/details/72514812我大概总结一下四边形优化...原创 2019-03-19 00:51:50 · 240 阅读 · 0 评论 -
HDU4035(概率dp)
解题思路:一开始做的时候,推出来的概率递推表达式, 是这样的 E[i] = ki*E[1] + ei*0 + (1-ki-ei)/m*( E[father[i]]+1 + ∑( E[child[i]]+1 ) ); = ki*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei)/m*∑(E[child[i]]) + (1-ki-ei);...原创 2019-03-21 21:42:55 · 152 阅读 · 0 评论 -
HDU2191(多重背包问题dp)
解题思路:多重背包裸题#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define inf 0x3f3f3f3fusing namespace std;int dp[105];struct node{ int v,w,num;}s[...原创 2019-03-15 15:06:25 · 179 阅读 · 0 评论 -
HDU2844(dp多重背包问题)
解题思路:多重背包问题其实可以转换成01背包问题,但是层数相较于以前会多,所以不能用多层,还是用单层dp,或双层循环dp比较好。就是把以前一个物品的数量用二次幂分解当成多个物品。#include<cstdio>#include<cstring>#include<algorithm>#define inf 0x3f3f3f3fusing namesp...原创 2019-03-15 14:40:04 · 343 阅读 · 0 评论 -
HDU1114 完全背包问题
01背包:每种物品只能选一次完全背包:每种物品不限定选的次数解题思路:裸题,动态规划推导过程见下面: #include<cstdio>#include<iostream>#include<cstring>#define inf 0x3f3f3f3fusing namespace std;struct node{ int p,w...原创 2019-02-09 23:35:50 · 263 阅读 · 0 评论 -
poj2868(DP状态压缩类似于TSP旅行商问题)
解题思路:做这道题的时候初始化dp[(1<<n)-1][a]=0;,那么后面件状态循环必须从(1<<n)-1向0循环。其他的就是单纯的状态压缩DP)#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using names...原创 2019-02-16 10:58:00 · 258 阅读 · 0 评论 -
hdu1159 最长公共子序列问题
解题思路:方程也简单,dp[i+1][j+1]={dp[i][j]+1 s[i]=t[j] {max(dp[i][j+1],dp[i+1][j]#include<cstdio>#include<cstring>#include<iostream>using...原创 2019-02-09 14:32:01 · 144 阅读 · 0 评论 -
hdu1203 01背包问题
解题思路:做完之后看了一下网上别人做的,发现还有些区别。反正直接构造一个10^4*10^4的double数组空间肯定超了,所以我用了轮换数组,但做完后发现只要用一维即可。还有个问题就是百分号的输出是%%,要打两个%!#include<cstring>#include<cstdio>#include<iostream>#include<algor...原创 2019-02-09 14:00:20 · 265 阅读 · 0 评论 -
HDU2602 01背包问题
解题思路:裸题,动态规划方程为:dp[n][j]=0;dp[i][j]={dp[i+1][j] j<t[i] {max(dp[i+1][j],dp[i+1][j-t[i]]+c[i])#include<cstdio>#include<iostream>#include<cstring>#include<...原创 2019-02-09 13:06:48 · 142 阅读 · 0 评论 -
poj2342树状dp
题意:某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大。思路:水题一道,树状数组的裸题。dp[i][0]=dp[v][1] +m[i]dp[i][1]=max(dp[v][1],dp[v][0])0表示出场,1表示没出场,...原创 2018-09-13 09:29:28 · 97 阅读 · 0 评论 -
poj 3659 Cell Phone Network 树型DP
题目:poj 3659 Cell Phone Network题意:农夫给他的每个牛发另一个手机(有点扯),现在要在农场建设信号塔以便所有的牛可以相互联系,每个信号塔可以供和他相连的农场使用,所有农场形成一颗树,问要达到要求最少建塔的数量。也就是给一颗树,每个节点可以覆盖和他相连的所有节点,现在问你用最少的点把所有的点覆盖完。这个题目和poj1463有点相似,poj1463是用点覆盖边,相对...转载 2018-09-13 00:29:52 · 152 阅读 · 0 评论 -
poj1112 dp
题意:有N个人要分成两组,已知每个人认识哪些人,限制是组内人员必须互相认识,要求输出一组两组人数差最小的分配方案。思路:这道题稍微有点麻烦。要经过一下几个步骤的处理:1.各个点之间,将只有互相认识的点连线,然后求补图。这样做方便找出相互认识的几个集合。这几个集合间可以随意组合,因为不同集合里的人是相互认识的。于是问题就变成求每个集合里人相互认识的问题了。2.求每个集合里人相互认识的情况...原创 2018-09-12 21:31:34 · 166 阅读 · 0 评论 -
HDU1248(记忆搜索)
解题思路:一开始以为是个完全背包问题,后来发现又有点不太对劲。其实是记忆搜索......#include<cstdio>#include<cstring>#include<iostream>using namespace std;int dp[4][10009];int cost[3]={150,200,350},n;void solve()...原创 2019-02-10 10:50:21 · 98 阅读 · 0 评论 -
HDU1059 (多重部分和)
多重部分和详见挑战p63解题思路:反正就是把弹珠的总价值除以2,就是需要达到的目标和。接下来就是裸的多重部分和问题。如果我直接做,应该会用标记布尔型的方式来做,复杂度会高不少。如果用dp[i+1][j]=:达成价值j后,i号弹珠剩余个数这样来解,由于包含的信息量大,所以复杂度降低了,是个很好的方法。#include<cstdio>#include<cstring>...原创 2019-02-10 12:12:17 · 282 阅读 · 0 评论 -
HDU3998(最长上升子序列LIS)
解题思路:其实就是不断地求LIS,然后把LIS中的元素给去掉,然后再做。直到LIS中的元素个数减少为止。其中用到了二分搜索,做一次LIS的复杂度为(Onlogn)#include<cstdio>#include<cstring>#include<algorithm>#define inf 0x3f3f3f3fusing namespace std;...原创 2019-02-10 17:02:05 · 196 阅读 · 0 评论 -
HDU4507(数位dp,模板)
解题思路:dp[i][h][s]:i代表第几位数,h代表数字和对7的余数,s代表数字对7的余数。#include<cstdio>#include<cstring>#define ll long long//#define mod 1000000007LLusing namespace std;ll mod=1e9 + 7;ll d[20],p[20];//...原创 2019-03-15 12:03:23 · 828 阅读 · 0 评论 -
poj3107(树型dp)
解题思路:这题真的让我认识到使用STL效率确实不高。打过CCCC天梯赛,都懒得自己写数据结构了,ACM不行。一开始我用vector来表示数,2s超时,然后用结构体表示,降到594ms.然后把记录的q也从vector改成数组,再降低一百毫秒。这道题其实就是求重心,以前在树的分治中,为了确保分治效率也用过。详见我树的分治那一段的题解吧#include<cstdio>#inclu...原创 2019-03-19 17:43:10 · 240 阅读 · 0 评论 -
HDU3652(数位dp)
解题思路:和HDU2089相对,数位dp目前我看到两种写法。一种是初始化好dp,后面直接用,这种适用于范围比较小的时候。还有一种就是在做道题,直接带入dfs,一个询问一次dp.代码中的lim代表是不是可以0——9随便取,即限制他不能大于输入的n.总体然说感觉就是个记忆化搜索。dp[pos][sts][mo],中pos代表第pos位数,sts代表在pos-1前的状态(0表示前面没有13出现,且pos...原创 2019-03-14 13:00:53 · 216 阅读 · 0 评论 -
HDU2089(数位dp)
解题思路:第一次有目的练数位dp,数位dp顾名思义就是按照数字一位一位来进行动态规划。但要注意,这道题中数位dp的区间是[l,r),所以一开始输入的r要+1,才是[l,r]范围的。#include<cstring>#include<cstdio>using namespace std;int dp[10][10],d1[10],d2[10];void init...原创 2019-03-14 10:46:29 · 262 阅读 · 0 评论 -
hdu1992(轮廓线dp铺砖问题)
解题思路:关于铺砖问题https://blog.csdn.net/u013480600/article/details/19499899讲的很清楚其实就是从左上角开始向下右下方向循环下去。dp[cur][k]:表示当前处理点(i,j)左上方的状态值,dp[1-cur][k]表示的是包括(i,j)点的新一轮生成状态值。动态规划公式就像代码中注释的一样。#include<cst...原创 2019-02-17 19:26:49 · 432 阅读 · 0 评论 -
poj1769(用线段树来维护dp)
解题思路:详见挑战p207。dp[i][j]:表示到第i个sorter为止,最大值被移动到第j个位置所需要的最短子序列长度。inf表示不可达。dp[0][1]=0(0代表没有sorter时,自然只能输出第一位的最大值,需要sorter个数为0)dp[0][j]=INF(j>1)dp[i+1][j]=dp[i][j](ti!=j)(如果说第i个sorter的结束位置不为ti,自...原创 2019-02-17 11:24:57 · 379 阅读 · 0 评论 -
poj3734(矩阵dp)
解题思路:详见挑战P202。#include<cstdio>#include<cstring>using namespace std;int m[3][3]={{2,1,0},{2,2,2},{0,1,2}};struct mat{ int s[3][3]; mat() { memset(s,0,sizeof(s)); }};mat matm...原创 2019-02-16 20:34:32 · 217 阅读 · 0 评论 -
HDU5119(记忆化搜索)
解题思路:题是简单题,但是数据类型坑了我一下。必须得用长整型才能过由于pre_j^s[i]=now_j 可得 pre_j^s[i]^s[i]=pre_j=now_j^s[i].所以可得动归方程dp[i+1][now_j]=dp[i][now_j^s[i]]+dp[i][now_j]#include<cstdio>#include<cstring>...原创 2019-02-10 19:04:34 · 181 阅读 · 0 评论 -
poj1080
题目大意是:给定两组DNA序列,要你求出它们的最大相似度每个字母与其他字母或自身和空格对应都有一个打分,求在这两个字符串中插入空格,让这两个字符串的匹配分数最大 思路:忙着效率刷题,一时间没想到思路借鉴了一下网上的思路。。。。该题的动态规划推导如下:dp[i][j]=max(dp[i-1][j-1]+m(s1[i],s2[j]),dp[i][j-1]+m('-',s2[j]),dp...原创 2018-09-12 14:49:25 · 138 阅读 · 0 评论