
DP
文章平均质量分 79
cillyb
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #374 (Div. 2) C. Journey(dfs+dp)
dp[i][j]表示在i点出走过j个点所需的最短时间。状态转移方程:dp[i][j] = min(dp[i][j], dp[k][j-1]+dis[k][i])原创 2016-10-07 15:20:11 · 419 阅读 · 0 评论 -
2017 四川省赛 L.Nice Trick(递推 DP)
思路:方法一:因为已经告诉你了n个取3个的乘积和,所以可以利用这个公式递推,ans[i] = ans[i-1]+S(i-1,3)*a[i]方法二:设 f(i, j) 表示在前 i 数里面挑 j 个乘起来的总和,那么f(i, j) = f(i − 1, j) + f(i − 1, j − 1) × ai方法一代码:#include#include#incl原创 2017-07-16 22:17:17 · 819 阅读 · 0 评论 -
西电OJ 1038 裁玻璃(状压DP)
题意:给你一个n*m的矩阵,有一些格子是好的一些是坏的,问你最多能剪出多少个2*2的正方形。(n,m思路:正好前几天做过炮兵布阵,跟那题很类似(点击打开链接),注意判断下地形和状态是否冲突,地形和地形是否冲突,因为是2*2的,所以跟三个方向有关和自身位置4个地方不能冲突。注意预处理合法状态时枚举到1可,因为两边肯定有一个不行(因为假如1标志的是2*2的右下角,那么最左边的不可能原创 2017-07-21 00:33:03 · 726 阅读 · 0 评论 -
Lightoj 1011 Marriage Ceremonies(状压dp入门 or km板子)
题意:给你n*n的矩阵,a[i][j]代表第i个男人和第j个女人之间的满意度,求男女一一配对后,最大的满意度之和。(n思路:可以直接套KM板子,n^3复杂度,因为n比较小,也可以用状压做,n^2*2^n复杂度转移方程:dp[i][sta|(1代码:#includeusing namespace std;const int maxn = 17;int dp[ma原创 2017-07-19 13:10:30 · 2929 阅读 · 0 评论 -
POJ 3254 Corn Fields(状压DP入门)
题意:一个m*n(m, n 要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)思路:可以看代码中的注释。转移方程:dp[i][sta] = ∑(dp[i-1][sta']) (sta‘为与sta不冲突的状态)带注释代码:#include #include using namespace std;#define m原创 2017-07-19 17:05:57 · 347 阅读 · 0 评论 -
Lightoj 1037 Agent 47(状压DP)
题意:你现在需要消灭n个敌人,n个敌人的血量已知,你的普通攻击力为1,但是如果你杀死敌人i可以用它的武器去杀死其他敌人,p[i][j] 表示用敌人i的武器射杀敌人j会减p[i][j]滴血.问你最少可以攻击多少次可以将敌人杀死。思路:点击打开链接定义集合s为死亡敌人的集合。dp[s] 为让集合为s的人死亡最小需要的攻击次数。如果现在想要消灭敌人i 并且敌人原创 2017-07-19 22:37:16 · 323 阅读 · 0 评论 -
FZU 2218 Simple String Problem(状压DP)
题意:给你一个长度为n的字符串,仅包含前k个小写字母,求两段子串A和B,A和B中间没有共用的字母类型,求len(A)*len(B)的最大值。(n思路:状态压缩dp(点击打开链接) * n^2的复杂度,求出每个状态( 1<<n )所能达到的最大长度。 * dp,求出字母种类小于等于当前state所能达到的最大值(因为可能包原创 2017-07-19 23:39:13 · 399 阅读 · 0 评论 -
POJ 1185 炮兵布阵 (经典状压DP)
题意:一个n*m矩阵(n互相攻击。每个炮的攻击范围是上下左右两个距离。思路:(点击打开链接)可以发现,对于每一行放大炮的状态,只与它上面一行和上上一行的状态有关,每一行用状态压缩的表示方法,0表示不放大炮,1表示放大炮,同样的,先要满足硬件条件,即有的地方不能放大炮,然后就是每一行中不能有两个1的距离小于2(保证横着不互相攻击),这些要预先处理一下。然后就是状态表示和转移的原创 2017-07-19 21:21:47 · 820 阅读 · 1 评论 -
POJ 3311 Hie with the Pie(经典TSP问题)
题意:一个人送外卖,每次送外卖不超过10个地方,给你两两之间所需时间,求送完外卖回到店里的总时间最小。思路:先floyd跑一下两两之间最短路; dp[i][j]表示i状态时并且现在处于j位置时所用的最少时间。状态转移方程:dp[i][v] = min(dp[i][v], dp[i^(1代码:#include#include#includeusing names原创 2017-08-02 23:24:07 · 354 阅读 · 0 评论 -
HDU 5117 Fluorescent (数学 状压DP)
题意:有n个灯泡,初始均为关闭状态,m个开关,每个开关可以改变一些灯泡的状态(开变关,关变开),打开每个开关的操作是随机等概率的,以X表示每次开着灯泡的数量,求E(x^3) *2^m % 1e9+7思路:原创 2017-08-03 01:03:15 · 491 阅读 · 0 评论 -
Codeforces Round #424 (Div. 2) D. Office Keys(贪心 二分 or DP)
题意:有n个人和k把钥匙(n=n),n个人都必须拿一把钥匙去p点,一把钥匙不能多人拿。问最后每个人都到达p点最少需要多少时间。思路:对人和钥匙都排序一下,然后有两种做法:1.二分答案 贪心验证:每次尽量取左边的钥匙2.DP:转移方程:dp[i][j] = min(dp[i][j-1], max(dp[i-1][j-1], abs(a[i]-b[j])+abs(b[j]-原创 2017-07-14 23:31:17 · 510 阅读 · 0 评论 -
hrbust 1396 射镖游戏(思维 背包)
题意:有1-20分这些分值,每次可以得到i分或i*2分或i*3分,另外有个25分,可以得到25分或者25*2分,现在要求得到n分,且最后一次必须是x*2分,问有多少种可能方案。思路:因为得分没有顺序要求,只要求有一次是二倍得分,所以我们可以用总方案数减去没用二倍得分的方案数,那么减出来的结果就是至少有一次是二倍得分的方案数。求方案数可以用背包去做。代码:#include原创 2017-07-14 21:53:24 · 352 阅读 · 0 评论 -
计蒜客 2017 复赛 腾讯消消乐 (状压dp)
腾讯推出了一款益智类游戏——消消乐。游戏一开始,给定一个长度为 nn 的序列,其中第 ii 个数为 A_iAi。游戏的目标是把这些数全都删去,每次删除的操作为:选取一段连续的区间,不妨记为 [L,R][L,R],如果这一段区间内所有数的最大公约数 \geq k≥k(kk 值在游戏的一开始会给定),那么这一段区间就能被直接删去。注意:一次删除以后,剩下的数会合并成为一个连续区间。原创 2017-07-13 00:01:59 · 567 阅读 · 0 评论 -
第十四届浙江省赛 ZOJ 3962 Seven Segment Display(数位DP)
Seven Segment DisplayTime Limit: 1 Second Memory Limit: 65536 KBA seven segment display, or seven segment indicator, is a form of electronic display device for displaying decimal numera原创 2017-04-22 19:58:18 · 2203 阅读 · 0 评论 -
poj 3186 Treats for the Cows(区间dp)
Treats for the CowsTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5172 Accepted: 2697DescriptionFJ has purchased N (1 The treats are interesting fo原创 2016-08-17 10:44:13 · 510 阅读 · 0 评论 -
51nod 1050 循环数组最大子段和(思维)
题意:N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。思路:答案有两种原创 2017-05-14 17:58:26 · 360 阅读 · 0 评论 -
HDU 3899 JLUCPC (树形DP)
题意:有n个点,每个点有相应的人数,n-1条带权边,从a点的所有人走到b点的花费是a点的人数*边权值,问所有人在哪个点集合能够使花费最小求最小花费。思路:先dfs求出以1为根节点使每个点后代到这个点集合的花费sum以及这个点及其后代共有几个人cnt然后枚举每个点i作为集合点(根节点)时他的花费就是sum[i]+他的父节点减去从i来的人的花费+父节点总人数减去从i来的人数*边权原创 2017-05-16 13:40:55 · 550 阅读 · 0 评论 -
qduoj 80 树结构重逢(树形DP)
题意:给定一颗包含n个节点的无根树,并且把节点从1-n编号。现在让你求对于每个点,求出所有点到这个点的距离的和(距离当然是最短距离了..)。思路:跟HDU3899一毛一样的思路,注意sum要开long long。代码:#include#include#include#includeusing namespace std;ty原创 2017-05-16 13:43:35 · 656 阅读 · 0 评论 -
codevs 1427 特种部队 (双路DP)
题意:一排按钮,从左边的第一个按钮开始向右按动,中间可以跳过某些按钮,按动到最右边的按钮后,反向向左按动。最终,每个按钮都要按且仅按一次。每两个相邻按钮上数字之差的总和的最小值,便是解开这把锁的密码。 思路:f[i][j]表示第一路扩展到i,第二路扩展到j的最优值.对于max(i,j)后的一点k扩展 (1~max(i,j)可以看做是被两路分成的两段不连续序列)则:f[i]原创 2017-05-18 14:11:32 · 752 阅读 · 0 评论 -
codevs 1315 摆花 (DP)
题意:小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。试编程计算,一共有多少种不同的摆花方案。思路:dp[i][j] 表示用前i种花摆j天的方案数,状态转移方程:dp[原创 2017-05-18 15:52:18 · 575 阅读 · 0 评论 -
之江学院2017ACM校赛 Problem B: qwb与矩阵(记忆化搜索)
题意:(n, m)的迷宫,每个点都有一个值,从(1, 1)走到(n, m) 有三种走法:移动到(x+1,y),(x,y+1)或者(x,y*k),其中k>1,问走到(n,m)的最大价值。思路:和HDU1078很像,记忆化搜索就行。代码:#include#include#includeusing namespace std;const int maxn = 25;原创 2017-06-01 20:00:00 · 1523 阅读 · 0 评论 -
之江学院2017ACM 校赛 Problem M: qwb与二叉树(记忆化搜索)
Description某一天,qwb正在上数据结构课。老师在讲台上面讲着二叉树,qwb在下面发着呆。突然qwb想到一个问题:对于一棵n个无编号节点,m个叶子的有根二叉树,有多少种形态呐?你能告诉他吗?Input多组输入,处理到文件结束,大约有104组数据。每一组输入一行,两个正整数n,m(0≤m≤n≤50),意义如题目所述。Output每一行输出原创 2017-06-03 16:58:26 · 699 阅读 · 0 评论 -
HDU 4427 Math Magic(DP)
题意:告诉你K个数的和为N,K个数的LCM为M,问有多少满足条件的解。(N, M 思路:dp[i][j][k]表示长度为i 和为j lcm为k的方案数。可以推出状态转移方程dp[i+1][j+x][lcm(k, x)] += dp[i][j][k]因为三维存不下,所以需要滚动数组,还有枚举x的时候只要枚举M的因子即可。为了节约时间可以预处理范围内的任意两数的lcm。原创 2017-07-26 17:18:25 · 381 阅读 · 0 评论 -
UVA 12260 Free Goodies (DP)
题意:有n个糖果,每个糖果有p,j两个值分别是Petra和Jan拿这糖果的开心值,现在有两个人Petra和Jan,Petra的取糖果方式是优先去p值大的,若有多个选j值小的;Jan取糖果的方式是尽量让自己开心值(取出糖果的j值和)大的情况下让Petra的开心值(取出糖果的p值和)也大,给出先选糖果的人,问说最后两人的开心值分别为多少。思路:我们可以知道Petra直接贪心选取即可。所以对原创 2017-08-03 23:33:58 · 508 阅读 · 0 评论 -
Codeforces 688E The Values You Can Make(DP)
题意:给你n个数和一个k,让你在n个数字里面选取组合s1,这个组合s1里面的所有元素的和为k,然后让你在这个和为k的组合s1里面再选若干个数字, 再组成一个组合s2,问s2的所有元素的和的可能值;要找出所有的s1然后对所有的s2找出所有的可能值。思路:dp[i][j]表示和为i的那些数是否能组成j,枚举c[x],当把c[x]加到已有的集合中当dp[i-c[x]][j]==1时原创 2017-08-04 00:34:20 · 421 阅读 · 0 评论 -
HDU 5863 cjj's string game(矩阵优化DP)
题意:让你用k种字母构造出两个长度为n的a,b串,问满足a,b最长连续对应子串相同的长度不恰为m的方案数。 n(1思路:dp[i][j]:表示长度为i的串,长度j后缀连续对应相等。转移方程:dp[i][0]=(dp[i-1][0]+…+dp[i-1][m]) * k * (k-1) dp[i][j]=dp[i-1][j-1] * k,j=1,2,…,m 这样原创 2017-09-08 15:32:09 · 429 阅读 · 0 评论 -
Codeforces Round #291 (Div. 2) E. Darth Vader and Tree(矩阵优化DP)
题意:给你一颗树,有无限个节点,每个节点有n个儿子,据他第i个儿子的距离为di,问这棵树有多少个点离根的距离不超过x。思路: f[i]表示路径长度恰为i的能到的点个数,首先可以列出一个DP:f[i]=∑nj=1f[i−dj],边界是f[0]=1。 似乎不是那么好做。但是注意到,di=100,这意味着DP可以简化一下,变成连续的;f[i]=∑100j=1f[i−j]∗原创 2017-09-08 17:40:46 · 375 阅读 · 0 评论 -
2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 HDU 6212 1007 Zuma (区间DP)
题意:给你一串01串,你可以在任意位置插入0或1,有三个及以上的连续的相同的会消去,会有连锁反应,问至少插入几次能消完。思路:原题。。BZOJ 1032// POJ 2915。。解法可以看这篇文章:点击打开链接代码(直接用了这份:点击打开链接):#includeusing namespace std;int p[26];int colors[26]原创 2017-09-17 18:20:28 · 2072 阅读 · 2 评论 -
2017沈阳网络赛 1008 HDU 6201 transaction transaction transaction(树形dp)
题意:给你一颗树,边有权值,现在有本书,每个点都有这本书的价格,现在你可以选任意一点作为起点买这本书,跑去任意一点卖掉,过程中消耗路径的权值花费,问你任选起点和终点最大收益是多少。思路:树形DP,dp[u][0]表示以u为根的子树中买一本书的最大收益,dp[u][1]表示以u为根的子树中卖一本书的最大收益。dp[u][0]+dp[u][1]即为在以u为根的子树中选两点的最大收益。原创 2017-09-10 19:22:26 · 584 阅读 · 0 评论 -
HDU 5800 To My Girlfriend(DP)
题意:给定n和s,求f(i,j,k,l,m)表示下标i和j的数必选,k和l不选且选出数的和为s的选法方案数。思路:dp[i][j][k][l],表示前i个物品,权值和为j,已有k个必选,l个必不选的方案数。转移:枚举i1.选,增加权值,增加必选个数。2.选,增加权值,不增加必选个数。3.不选,不增加权值,增加不必选个数。4.不选,不增加权值,不增加必选个数。原创 2017-09-22 00:16:40 · 426 阅读 · 0 评论 -
Gym 100792H Hashing (DP)
题意:给你n个1个字节的数(16进制表示)(n0^s[0]+1^s[1]+2^s[2]+…k^s[k]的和最大, k任意,输出这个和的最大值。思路:懒得写了,,粘贴这位大佬的(点击打开链接)。。讲的很详细第一步:首先很容易想到一个简单的dp方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]+(arr[i]^j))原创 2017-10-02 21:27:34 · 978 阅读 · 0 评论 -
HDU 1864 最大报销额(01背包)
题意:现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。 (总发票数思路:首先找出所有有效的发票,然后做一次01背包就行了,但是金额是两位小数,所以可以都先乘上100变成整数再原创 2018-04-24 22:24:25 · 288 阅读 · 0 评论 -
HDU 2844 Coins(多重背包)
题意:n种硬币,每个硬币的值为ai,有ci个,求能组成多少个不大于m的不同的金额思路: 明显的多重背包,有两种解法,(当然母函数也可以,没试,不知道会不会T)一种是利用二进制优化,还有一种是(点击打开链接)三层循环(枚举种类,枚举数值,枚举个数)肯定超时,要想办法减去一层循环,仔细分析可以发现个数的那层循环可以省掉,代价是耗费更多的空间,开一个cnt数组记录当前第i种使用了多少个,其它两层循环不变...原创 2018-04-25 19:42:02 · 273 阅读 · 0 评论 -
HDU 1224 Free DIY Tour(最短路或DP)
题意:给你n个城市,每个城市都有一个风景值,再给你m条路,每条路连接两个城市,只能从序号小的到序号大的,问你从1号到n+1(就是1号)号能经过的风景值得和最大为多少,并且输出路径。思路:很容易想到可以用求最短路的方法求一个最长路;因为满足只能从小序号的城市到大序号的城市,所以也可以用DP来做,从小的城市开始遍历更新。(注意每个测试预处理的时候别忘了把n+1也清空)最短路代码:import java...原创 2018-05-04 11:05:07 · 460 阅读 · 0 评论 -
CodeForces 165E Compatible Numbers (dp)
题意:给你n个数,让你找到一个任意a[j]使得 a[j] & a[i] == 0,不存在输出-1。思路:我们可以知道a[i]&(M^a[i])一定为0,(M为二进制全为1),当然a[i]不仅仅只和M^a[i]与运算后为0,M^a[i]的二进制中还有许多位为1,那么这些变为0,也是可以作为答案的。所以可以dp递推处理,见代码。代码:#includeusing names原创 2017-08-30 17:31:29 · 328 阅读 · 0 评论 -
HDU 5860 Death Sequence (DP 递推)
题意:n个人排成一行,从第一个人开始,每隔k个人报数(1, k+1, 2*k+1...),报到数的人被杀死,剩下的人重新排成一行重复上述操作。q次询问,每次询问第qi个死的人编号。思路:将编号变为0~n-1,若某轮中某人的编号为i,如果i被k整除则被杀,否则在下轮中编号为i-i/k-1,这是一个子问题。定义一个结构体记录递推一遍就可以得到每个人是第几回合第几个被杀的。代原创 2017-09-15 14:02:49 · 525 阅读 · 0 评论 -
BZOJ 1566 管道取珠(DP好题)
题意:有个装置,左侧有上下两条管道分别有n个和m个不同颜色的两种球,右侧一条空管道。每次可以选左侧的一条管道将最右侧的球推到右侧管道,经过n+m次操作,右侧管道从右到左形成一个输出序列。求不同种类的输出序列的产生方式数的平方之和。n,m 思路:这个平方看起来很难搞。。有一个很巧妙的转换,我们可以看成两个人来玩这个游戏,那么答案就是第二个人的每个方案在第一个人的所有方案中出现次数的和原创 2017-09-22 22:08:34 · 796 阅读 · 0 评论 -
BZOJ 4806 炮(DP)
题意:一个n*m的棋盘,(n,m思路:n, m比较大 状压会T了。可以发现每一列只能0个或1个或2个炮, 列的摆放位置并没有什么关系,所以只需记录摆放1个和2个炮的列数就行。dp[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数。状态转移 :dp[i][j][k] = (dp[i][j][k]原创 2017-08-04 01:07:52 · 867 阅读 · 0 评论 -
POJ 2411 Mondriaan's Dream (状压DP)
题意:用1*2的矩形拼成和h*w的矩形有几张拼法.(h, w 思路:用1表示该处竖着放一块砖,用0表示横着放的砖,或者竖着放的第二行。一行中每个未放竖的矩形区间中的0数量一定要是2的倍数。这样从第一行递推到第h行,最后答案是dp[h][0],因为前i-1行状态确定最后一行的状态也就确定。代码:#include#include#includeusin原创 2017-07-26 20:18:06 · 381 阅读 · 0 评论 -
HDU 6148 && 2017 百度之星复赛 1005 Valley Numer(数位dp)
题意:当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。比如,1,10,12,212,32122都是 Valley Number。121,12331,21212则不是。度度熊想知道不大于N的Valley Number数有多少。(le原创 2017-08-18 18:51:46 · 456 阅读 · 0 评论