dp
zyz_3_14159
这个作者很懒,什么都没留下…
展开
-
HDU-3886-数位dp
题目大意:为一个区间内有多少数满足给定函数曲线的数的个数;题目解析:首先因为数据很大,需要用字符串保存,并且要处理掉前导零,否则会对答案有影响,dp第二维表示前一个数是多少,dp的第三维表示当前表示的opt;AC代码:#include#include#include#include#includeusing namespace std;typedef long long l原创 2017-05-09 23:45:36 · 230 阅读 · 0 评论 -
POJ-2609-双塔dp
题目大意:有n辆汽车需要运载到船上,船上有两块甲板A,B,长度都是L,n辆汽车必须一次上去,问最多能运几辆车。题目解析:先预处理前缀和,定义dp[i][j],表示前i辆车,A甲板用的长度为j能否满足条件,这样状态转移的时候只需要考虑他能否被运到A或者B上了。AC代码:#include#include#includeusing namespace std;int n,len,a[原创 2017-04-29 15:33:03 · 418 阅读 · 0 评论 -
ZOJ-3331-双塔dp
题目大意:有两台机器,n个任务,每个任务在机器A,B上花费的时间都被给出,并且任务i开始的条件是任务i-1被A完成或者正在被B做,问最少需要花费多少时间;题目解析:呀,我的第一道双塔dp,双塔dp又可以称为调控问题,想象成两个机器就是两座塔,dp[i][j]表示的就是任务i在A-B的时间差之下最少花费的时间,如果当前AB的情况。AC代码:#includeusing namespa原创 2017-04-29 13:00:59 · 340 阅读 · 0 评论 -
POJ-2373-单调队列优化dp
题目大意:有一块长度为l的草原,你需要用洒水器把所有草坪都覆盖并且每块草坪只能被覆盖一次,有n个奶牛所在的草坪属于[l,r],这些区间只能有一个洒水器;题目解析:定义dp[i]为在第i块草坪结束的时候所苏姚最少的洒水器,dp[i]=min(dp[j]+1),i-2bAC代码:#include#include#include#include#includeusing names原创 2017-04-09 22:15:50 · 857 阅读 · 2 评论 -
POJ-1821-单调队列优化dp
题目大意:有n个工人准备铺m个连续的墙,每个工人有他必须图的一面墙壁Si,最多连续铺Li,每铺一个就花费Ci的钱,问最多要多少钱;题目解析:首先肯定将n个工人按照pos排下序,然后定义dp[i][j]表示第i个工人最后图第j块墙壁的最大值,那么dp[i][j]=max(dp[i-1][k]+(j-k)*cost);其中我们需要用单调队列维护dp[i-1][k]-k*cost的最大值,注意k的范原创 2017-04-08 14:56:52 · 400 阅读 · 0 评论 -
POJ-3071-dp,单调队列
题目大意:给定n个数字和m,现在需要把他分成若阁个连续的组,使得每组的的sum都必须要不大于m,问所有组的最大数字之和的最小值是多少;题目解析:一开始看到最大值的最小值就想到了二分,其实大可不必,以后还是要提醒自己以后这种分组的题目大多可以用dp来做,dp[i]=min(dp[j]+max(j+1,j+2.......i)),其中要满足后面的j+1到i的sum要不大于m并且维护最大值,就是单调原创 2017-04-08 00:37:22 · 242 阅读 · 0 评论 -
POJ-2686-状态压缩
题目大意:旅行商问题加多了一个车票问题;题目解析:dp[i][j]表示车票序列为i,当前地点在j的最少花费,然后dfs即可;最后答案一定要%f不能%lf无语。知道的朋友望解答;AC代码:DFS:#include#include#include#include#includeusing namespace std;const double inf=3010;int gr原创 2016-11-27 21:34:44 · 218 阅读 · 0 评论 -
LightOJ-1085-树状数组,离散化,dp
题目大意:求出一个序列中有多少个递增序列(不需要是连续的)。题目解析:对于一个以i结尾的,那么dp[i]=sum(dp[j])+1(jAC代码:#include#include#include#include#includeusing namespace std;const int maxn=100010;const int mod=1000000007;int n,d原创 2016-11-22 20:45:30 · 297 阅读 · 0 评论 -
POJ-1769-线段树,dp
题目大意:有n个sorter,每个可以讲对应区间内的所有数升序排序,问至少要选择几个sorter,使得最大数出现在任意位置最后都能到达最后一个;题目解析:只要考虑极端情况,即最大数就出现在第一个,那么有点像01背包,定义dp[i][j]为用到第i个sorter最大值在j所需要最少的sorter,那么ti!=j的时候,dp[i][j]=dp[i-1][j],ti=j的时候,dp[i][j]=mi原创 2016-11-30 15:51:30 · 1422 阅读 · 0 评论 -
LightOJ-1125-dp
题目大意:有n个数字和q个询问,每次询问从n个数中取出m个使得sum能够整除d的取法总数一共有多少个;题目解析:本来想着dfs,但肯定超时;我们可以定义dp[i][j]表示取了i个,余数为j的取法总数,那么我们只需要枚举n个数更新dp即可,dp[i][j]+=dp[i-1][(j+d-(a[i]%d))%d](注意负数),有点类似于01背包;AC代码:#include#include原创 2016-11-13 19:52:09 · 171 阅读 · 0 评论 -
LightOJ-1033-区间dp,dfs
题目大意:给定一段字符串,问最少能添加多少个字母使得这个字符串能够成为回文字符串;题目解析:区间dp,定义dp[i][j]为把区间[i,j]中的字符全部转化为回文字符串所需要的最少次数,那么我们dfs记忆化搜索就好了;AC代码:#include#include#include#include#includeusing namespace std;const int inf=原创 2016-10-21 10:25:05 · 250 阅读 · 0 评论 -
LightOJ1086-Jogging Trails -状态压缩,欧拉回路
题目大意:给你一张单图,你需要遍历每条边最少一次,并且要回到一开始的起点,你可以自定义起点,问最少要走多少路;题目解析:首先我们要知道这道题目肯定是关于欧拉回路的;欧拉回路:无向图每个点的度数都是偶数,就可以正好遍历每条边一次并回到起点;所以本题就是要我们构造欧拉回路,我们把度数为奇数的节点构造出来,dp 的时候取出两个点,代价就是他们之间的最短路,所以我们就要用floyd把原创 2016-10-08 17:43:20 · 397 阅读 · 0 评论 -
HDU-3578-双塔dp
题目大意:有n个橘子,选一些装到两个袋子里,要求两个袋子里面重量相同,问袋子最大重量是多少;题目解析:dp[i][j]表示枚举到第i个橘子,两个袋子差值为j的时候的最大重量,注意橘子可以不取,并且如果有个橘子的重量为0答案就有解,状态转移的话很简单;AC代码:#include#include#includeusing namespace std;const int maxn=1原创 2017-04-29 16:48:24 · 356 阅读 · 0 评论 -
HDU-4722-线段树优化dp
题目大意:有n个人站成一排,现要求把他分成几组,要求每组的长度不能大于l并且每组最后一个人的身高必须严格大于前一个组的最后一个人的身高,每一组的得分为B[i]^2-B[i-1],问总得分的最大值是多少;题目解析:定义dp[i]表示以i作为结尾所能够取得的最大得分,那么dp[i]=max(dp[j]+val[i]*val[i]-val[j]);i-lAC代码:#include#in原创 2017-04-15 13:25:11 · 319 阅读 · 0 评论 -
LightOJ-1205-数位dp
题目大意:给定区间问区间内有多少数是回文数;题目解析:因为给定长度,其实就已经知道看了他的对称中心,所以从前往后dfs,判断前i位的时候,要判断后面是否可以取到,如果不可以去到,那么后面那位的前一位就必须小于limit,所以dfs要多一个变量ok;AC代码:#include #include #include #include #include原创 2017-05-09 17:14:32 · 344 阅读 · 0 评论 -
LightOJ-1140-数位dp
题目大意:给定区间问区间内所有数的10进制0的个数的总和是多少;题目解析:dp的第二维表示当前已经有多少个0,注意前导零和只有1个0要输出1;AC代码:#include #include #include #include #include using namespace std; typedef long long ll; ll dp[35][300];原创 2017-05-08 23:00:09 · 330 阅读 · 0 评论 -
UESTC-250-数位dp
题目大意:求一个区间内有多少个数中相邻数位之差大于等于2;题目解析::dp的第二维保存上一个数是多少,注意要处理前导零;AC代码:#include#include#include#include#includeusing namespace std;typedef long long ll;ll dp[20][12];int num[20];int ab(int x,原创 2017-05-08 19:50:26 · 310 阅读 · 0 评论 -
HDU-3652-数位dp
题目大意:求区间[0,n]有几个数中间的位数有13并且这个数能够被13整除;题目解析:跟上题一样。只不过因为要整除13所以dp多了一维表示当前位数模13的余数;AC代码:#include#include#include#include#includeusing namespace std;int dp[12][3][14];int n,num[12];int dfs(i原创 2017-05-08 16:49:33 · 258 阅读 · 0 评论 -
HDU-3555-数位dp
题目大意:问区间[0,n]中有多少个数中数位包括49;题目解析:定义dp[i][j]表示有多少个符合条件,i表示第几位,j=0的时候前面的位没有49并且上一位不是4,j=1的时候前面的位数没有49但是上一位是4,j=2的时候表示前面的位数已经包括49了;AC代码:#include#include#include#include#includeusing namespace s原创 2017-05-08 16:44:54 · 221 阅读 · 0 评论 -
HDU-3709-数位dp
题目大意:定义balance数,这个数中间可以有一个中枢,左右边的力矩相等,问区间内有多少个balance数;题目解析:定义dp[i][j][k]表示为第i位,第j位为中枢,当前和为k的个数,dfs的时候如果k已经为负数的话就可以剪枝了;AC代码:#include#include#include#include#includeusing namespace std;type原创 2017-05-04 23:01:01 · 268 阅读 · 0 评论 -
POJ-3252-数位dp
题目大意:前一个区间里二进制表示状态下0的个数不小于1的个数的数的个数;题目解析:定义dp[i][j]表示在i位上0个个数和1的个数的差值的个数,因为会产生负值所以临界值可以设置为32,这道题前导0会有影响,所以需要特别考虑;AC代码:#include#include#include#include#includeusing namespace std;int dp[40原创 2017-05-04 15:12:01 · 209 阅读 · 0 评论 -
HDU-4724-数位dp
题目大意:定义f(x),并给出a和r,问在(0,r)有几个数的f(x)值小于等于f(a);题目解析:定义dp[i][j]表示枚举到第i位,j表示f(a)与当前和的差值;AC代码:#include#include#include#include#includeusing namespace std;int dp[12][10010],n,m,num[12],all;in原创 2017-05-04 14:20:32 · 221 阅读 · 0 评论 -
HDU-2089-数位dp
题目大意:不要62和4的数字在区间(n,m)有几个;题目解析:数位dp模板题,dfs的时候判断前一位是否为6;AC代码:#include#include#include#include#includeusing namespace std;int dp[12][2],n,m,num[12];int dfs(int pos,int sta,bool limit){原创 2017-05-04 13:48:25 · 218 阅读 · 0 评论 -
HDU-4507-数位dp
题目大意 :给定区间,问满足条件所有数的平方和;题目解析:因为要求平方和,所以要用结构体保存个数,和,平方和;(附上大佬的解析)需要维护三个值(推荐使用结构体), 假定dfs推出返回的结构体是next,当前结果的结构体是ans①符合条件数的个数 cnt②符合条件数的和 sum③符合添加数的平方和 sqsum其中①是基础数位DP。②next.sum原创 2017-05-11 00:13:39 · 329 阅读 · 0 评论 -
HDU-4352-数位dp,LIS
题目大意:求给定区间呢的数满足最长子序列长度为k;题目解析:LIS,dp第二维表示当前的序列,第三维表示目标长度为k,dfs的时候更新序列的时候要像LIS一样找到>=i的第一位并且去掉然后加上第i位;AC代码:#include#include#include#include#includeusing namespace std;typedef long long ll;l原创 2017-05-10 19:41:15 · 236 阅读 · 0 评论 -
LightOJ-1032-数位dp
题目大意:给定n,fun(n)为n的二进制中有多少对相邻的1,求0到n所有的f(n)之和;题目解析:很明显的一道数位dp;定义 dp[i][0]为长度为i并且最高位为0的二进制数出现相邻1的总次数;dp[i][1]为长度为i并且最高位为1的二进制数出现相邻1的总次数;预处理:dp[i][0]=dp[i-1][0]+dp[i-1][1];dp[i][1]=dp[i-1][1]原创 2016-10-20 18:23:54 · 242 阅读 · 0 评论 -
LightOJ-1064-dp
题目大意:抛一个质地均匀的筛子n次,问最后总得分至少为x的概率是多少;题目解析:定义dp[i][j]表示抛了i次,总得分为j的次数,枚举时dp[i][j]+=dp[i-1][j-k];接下来算一下gcd就ok了;AC代码:#include#include#include#include#includeusing namespace std;typedef long long原创 2016-10-29 21:49:32 · 242 阅读 · 0 评论 -
LightOJ-1057-状压dp,记忆化
题目大意:有一张n*m的图,上面有一个起始点x,和最多15个金子g,每一步你可以走到相邻的8个格子,题目要求走完所有的金子并且返回初始点的最小路径是多少;题目解析:状态压缩,定义dp[i][j]表示在j序列下在第i个金子需要走的最小路径,如果是已经没有金子的话就返回到开始点的距离,dp的时候需要记忆化搜多dfs并且枚举的时候要恢复序列的值,有点像回溯法;AC代码:#include#i原创 2016-10-29 13:25:55 · 303 阅读 · 0 评论 -
POJ2411-Mondriaan's Dream-状态dp
题目大意:给你一个n*m的图,你可以用1*2或者2*1的方块填充它,问你有多少种填充方案;题目解析:首先明确肯定是状态dp,我们可以定义dp[i][j]为第i行填充序列为j的方案总数,并且前i-1行都已经是完全填充;在状态转移的时候,我们判断1.第i行第j个元素是1,如果上面那个是1,那么这块方块必须是横着放的,那么j+1个元素也是1,并且第i-1行第j+1个元素也是1;2.第i行第j原创 2016-09-26 14:55:12 · 250 阅读 · 0 评论 -
POJ3254-Corn Fields-状态压缩
//首先这道题目真的是好题,但是POJ太坑了,给的n和m的范围偏小了,一直WA,很无奈。题目大意:给你一张n*m的草坪,每一块如果是1就表示可以放东西,0就不可以,你不可以在相邻的草上面放东西,问你最多能放几个;题目解析:开始dp肯定从这一行上面的草坪开始转移,肯定要状态压缩,否则肯定超时并且不能记忆化搜索,有个小技巧,如果一个排列有两个相邻的肯定不可以,所以我们先判断x&(1AC代码原创 2016-09-25 22:01:40 · 250 阅读 · 0 评论 -
ZOJ1733-Common Subsequence
最长公共子序列,设dp[i][j]为X序列前i个元素和Y序列前j的元素所能构成的最长公共子序列;状态转移方程:{0i=j=0;dp[i][j]= dp[i-1][j-1]+1 X[i]=Y[j];max(dp[i-1][j],dp[i][j-1])else }#include#include#include#include#include原创 2016-09-21 20:40:33 · 301 阅读 · 0 评论 -
LightOJ1017-Brush (III) -dp
题目大意:给你n个点,一把长度为w的刷子,每次你可以刷一整行,问你刷k次最多能刷掉几个点;题目解析:首先这道题目肯定也跟x无关,我们先将所有点按纵坐标来排个序,dp[i][j]可以表示我们处理到第i个点,刷了j次的时候能够刷掉点的最大值,那么我们就需要在第i个点刷不刷做判断,如果不刷就是dp[i-1][j],刷了最多应该是dp[i-aff[i]][j-1]+aff[i]其中aff[i]为第i个原创 2016-10-10 12:55:48 · 227 阅读 · 0 评论 -
ZOJ3541-The Last Puzzle 区间dp
题目大意:给你一段长为n的序列,你可以自定义起始位置,每当你按下第i个按钮,他会在t[i]后弹起来,且每个按钮之间都有距离,d[i]表示第i个按钮到1个按钮所需要花费的时间,题目问是否有一种方法可以使所有按钮都被按下,如果有就要输出按下去的顺序;题目解析:首先我们明确大方向,这应该是一个区间dp的题目,并且有题目可知dp的时候一定要考虑方向;其次如果给你一段序列,你要在最短的时间遍历它,肯定要原创 2016-09-24 00:28:01 · 526 阅读 · 1 评论 -
ZOJ1227-Free Candies
题目大意:给你4堆长度为n的糖果,每种糖果有一种颜色([1,20]);和一个篮子,你每次可以在每堆最上面的那个糖果中取走一个放在篮子里,如果篮子里有相同的,就放到结果里面,如果篮子里的糖果颜色都不一样,并且已经有5个了,就失败,问你最多可以取走多少对糖果?题目解析:因为n才40,我们可以定义dp[41][41][41][41]表示每一堆取走多少个,这样时间复杂度为O(n^4),不会超时,可以暴原创 2016-09-20 21:34:42 · 463 阅读 · 0 评论 -
codeforce-628B-Cards
题目大意:给你3种颜色的卡片若干张,你有两种操作:1.挑选两张颜色一样的卡片变为一张那张颜色的卡片;2.挑选两张颜色不一样的卡片变为低三种颜色的卡片吗;问你最后会有什么情况;题目解析:不难发现每次操作之后卡片总数就减少一,为了记录各种卡片的个数,我们这里可以开一个三维dp[i][j][k];i表示取了第几次,因为最后肯定只剩1张卡片,而每次总数减少一,所以一共取了n-1次;j表原创 2016-09-20 12:00:55 · 347 阅读 · 0 评论 -
ZOJ3070-The Colored Stones - 状态压缩dp
题目大意:给你一段长为n的序列,每个石头都有一个颜色,一共有m中颜色,你可以每次拿走一块石头,最后这段序列没有一个颜色的石头会被另一个不同颜色的石头隔开,问你最少需要移走多少个石头;题目解析:最后的序列每种颜色的石头肯定都挤在一起,每次我们加一个石头的时候就需要考虑前面有没有这种颜色的石头,而不需要知道有多少个,所以我们就可以想到用状态压缩;dp[i][j][k]表示对第i块石头,颜色状态原创 2016-09-23 20:41:53 · 597 阅读 · 0 评论 -
LightOJ1013-Love Calculator-dp
题目大意:给你两个序列,让你找出能包含他们两个序列的最小长度和那个长度之下有几个序列能够满足;题目解析:最小长度很简单,dp一下,算出来是ans,接下来我们设dp[i][j][k]为s1前i个字母和s2前j个字母组成能够重叠且长度为k的个数,那个枚举的时候如果s1[i]=s2[j],dp[i][j][k]=dp[i-1][j-1][k-1],else dp[i][j][k]=dp[i-1][j原创 2016-10-09 20:18:46 · 436 阅读 · 0 评论 -
ZOJ1163-The Staircases
题目大意:给你n块积木,让你大成至少两排,且必须严格递减,问你有多少种解法;我们稍微转化一下,可以很简单的想到就是给你你个整数n,把n拆成若干个不相同的数,有几种解法;令 dp[i][j],i表示我们将要拆分的整数n,j表示最大的那个数不超过j,可以想到,当最大的那个就是j,那么dp[i][j]+=dp[i-j][j-1];当最大的那个小于j,dp[i][j]+=dp[i][j-1]...原创 2016-09-20 10:48:27 · 790 阅读 · 0 评论 -
LightOJ1018- Brush (IV) -状态压缩,DFS
题目大意:在二维平面坐标系上给你n的点,问你最少能用几条直线把他们都包括里面;题目解析:首先我们要预处理所有的直线出来,令s[i][j]表示由点i和点j所确定的直线能经过的点的集合,为此我们需要暴力n^3处理出来,接下来就是状态dp了,如果我们不用记忆化搜索DFS就会超时,所以只能DFS了,DFS中的break很关键,很抽象需要自行体会;AC代码:#include#include#原创 2016-10-08 19:23:13 · 250 阅读 · 0 评论 -
ZOJ3471-Most Powerful-状态压缩dp
题目大意:给你n个不相同的原子,第i个原子和第j个原子相撞会消耗掉第j个原子并且释放出pow[i][j]的能量,问你最多可以释放多少能量;题目解析:很明显这是一道状态压缩的题目,我们可以用dp[1AC代码:#include#include#include#include#includeusing namespace std;int main(){ int n,i,j,k,l原创 2016-09-26 15:47:08 · 211 阅读 · 0 评论