简单dp
dp
gongyuandaye
不要再问我会不会写可持久化非确定状态AC自动分块维护线段平衡仙人掌优化最小费用最大流预处理混合图上莫比乌斯反演莫队带花舞蹈链并查集树状数组套主席树预处理动态DP分治FFT求多项式逆元对数函数的指数函数用可持久化并查集合并最小费用循环流上插头DP了。
展开
-
HDU 6850 Game (博弈+dp)
题意:n个点,起初石子在第一个点,Dodo 和 ddd 轮流移动石子到一个从未访问过的点,且每次移动的距离必须大于前一段的距离,两人采取最优策略,求Dodo是否必胜。题解:博弈+dpdp[x][y]dp[x][y]dp[x][y]:x到y这条边是否为必胜态。若该状态是必胜态,那么从y到任意点的边所代表的状态都是必败态。由此,我们记忆化搜索即可。但是还有一个问题,就是我们在dfs的时候并没有考虑访问的点之前是否已经访问过,其实这是可以忽略的,因为距离递增,最终必然确定一个状态,由此就可以推得前驱状态了原创 2020-09-16 22:22:15 · 128 阅读 · 0 评论 -
CodeForces 28D Don‘t fear, DravDe is kind (dp)
题意:给出n辆卡车,编号1~n,现在要从这些卡车中选出若干组成车队,编号从小到大排,对于第 i 辆卡车,其人数为 ci ,价值为 vi ,要求其前面卡车总人数为 li ,后面卡车总人数 ri ,问满足这些条件的车队总价值最大值。题解:dp对于被选的车,其前面车的总人数+后面车总人数+这辆车的人数即所选车总人数,为定值,故把所有li+ci+rili+ci+rili+ci+ri值相同的车拿出来单独考虑。由于总人数固定,考虑lll即可。那么只有lilili为0的车才能更新初值。dp[i]dp[i]dp[i]原创 2020-08-18 10:33:54 · 416 阅读 · 0 评论 -
HDU 6804 Contest of Rope Pulling (乱搞+01背包)
题意:题解:乱搞+01背包原题意大概就是n个人里选和m个人里选,两者w和要相等,我们对m里的w取反即可。如果直接按照输入dp的话,w一直为正累加会有1e6,值域太大了,我们用random_shuffle随机化一下位置,这样大概可以保证前面的w和在0附近上下浮动了。w为负,向右平移即可。这边取了40000,随机两次过了。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<原创 2020-07-30 23:18:33 · 686 阅读 · 2 评论 -
2020牛客多校五 D. Drop Voicing (环上LIS)
题意:给定1-n的序列,可以进行两种操作,1、将倒数第二个数放到开头;2、将第一个数放到最后,若干次连续操作1被视为一段,问将其变为升序,需要的最少段数。题解:环上LIS若干的操作2 + 若干操作1,一定能将某个数变回正确的位置。我们只要在环上求n遍lis,哪个lis最长,说明不在正确位置的数最少,所需要的操作(2+1)也就最少。所以答案就是n−max(lis)n-max(lis)n−max(lis)。#define _CRT_SECURE_NO_WARNINGS#include<iost原创 2020-07-25 21:35:47 · 252 阅读 · 0 评论 -
HDU 6774 String Distance (序列自动机+dp)
题意:给出两个字符串a(1e5)和b(20),再给出q个询问区间l,r,求字符串a下标l到r的子串变为b最少要几次操作,每次操作限定为插入或删除一个字符。题解:序列自动机+dp从一个字符串a[l,r]a[l, r]a[l,r]变为另一个字符串bbb,我们可以先求得两串的lcslcslcs,先删去aaa中不是lcslcslcs的,共r−l+1−lcsr-l+1-lcsr−l+1−lcs,再补上使得与bbb相等,共m−lcsm-lcsm−lcs,所以一共是r−l+1+m−2∗lcsr-l+1+m-2*lcs原创 2020-07-24 23:01:02 · 214 阅读 · 0 评论 -
UVA 11651 Krypton Number System (dp+矩阵快速幂)
题意:给定一个进制base和一个score,问在该进制下有多少数满足下列条件:相邻两个数字不相同,前缀不能为0,所有相邻数字的差的平方和为score,所有数字都是整数。结果取模2^32(unsigned int)。题解:dp+矩阵快速幂令dp[i][j]dp[i][j]dp[i][j]表示满足当前分数为iii最后一个数字是jjj的数字的个数。可以得到状态转移方程:dp[i+dis][j]=∑dp[i][k]dp[i+dis][j]=∑dp[i][k]dp[i+dis][j]=∑dp[i][k],其中d原创 2020-06-30 16:00:50 · 188 阅读 · 0 评论 -
HDU 4455 Substrings (dp+预处理)
题意:给定一个整数串,有Q组询问,问这个串中长度为W的子串中不同的数字个数之和为多少。题解:dp+预处理dp[i]dp[i]dp[i]:长度为iii子串中不同数字个数之和。对于1 1 2 3 4 4 5,我们先假设w为2:可得子串为【1 1】【1 2】【2 3】【3 4】【4 4】【4 5】若w为3:可得子串为【1 1 2】【1 2 3】【2 3 4】【3 4 4】【4 4 5】我们发现,w=3相当于w=2的前5个子串往后扩充一位,并将w=2的最后一个子串删除,那么我们可得递推方程:dp[i]原创 2020-07-04 21:49:00 · 253 阅读 · 0 评论 -
CodeForces 1216F Wi-Fi (单调队列+dp)
题意:有n个房间,需要把n个房间全部连上网,可以使用i的代价直接将第i个房间连上网。有一些房间可以放路由器,代价也是他的标号i,路由器可以使得i-k,到i+k之间所有房间通上网,求最小代价使得全部房间通网。题解:单调队列+dpdp[i]dp[i]dp[i]:从1到iii需要的最小代价。遍历1到n+kn+kn+k,因为有的房间路由器范围超过了右端点但能使代价减小。对于点iii,若i−ki - ki−k存在放路由器的点,则[i−2∗k,i][i - 2 * k, i][i−2∗k,i]都可覆盖,那么就需原创 2020-06-07 20:43:04 · 355 阅读 · 0 评论 -
CodeForces 95E Lucky Country (并查集+多重背包优化)
题意:n个点m条边,构成多个连通块,增加最少的边,使得至少有一个连通块的点个数只包含4和7。题解:并查集+多重背包优化先用并查集求出每个连通块的点的数量,增加边数,其实就是将几个连通块组合,看是否满足要求。我们用多重背包。对于背包里的物品,数量就是相同点数的连通块数量,价值就是单个连通块包含的点数。求出dp[i]dp[i]dp[i]表示iii个连通块具有的价值,即点数总和。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#includ原创 2020-06-02 18:15:53 · 449 阅读 · 0 评论 -
CodeForces 484D Kindergarten (dp)
题意:n个数,将它们全部分成任意组,每个组应该是连续的一个非空段,一个组的值是最大与最小的差,求所有组的值的和。题解:dp在最佳答案中,成组的任何线段都在边界上包含其最小值和最大值。否则,最好将此段分割为其他两个段。另一个要注意的是,最优解中的每个片段都是严格单调的递增或递减。遍历所有元素可得O(n)解法。dp[i][1]dp[i][1]dp[i][1]:以iii结尾的组是上升的,所有组的值和。dp[i][0]dp[i][0]dp[i][0]:以iii结尾的组是下降的,所有组的值和。#define原创 2020-05-19 19:58:55 · 142 阅读 · 0 评论 -
CodeForces 730J Bottles (01背包)
题意:给出n个杯子的容量和杯内水的体积,问最少多少个杯子能够装下所有的水,以及在这个杯子数量下最少需要倒多少体积。题解:01背包先找最少需要多少个杯子。求出总水量后,按照杯子容量从大到小顺序装。接着求最少需要倒多少体积。用dp[i][j]dp[i][j]dp[i][j]表示用了i个杯子,装了j体积的水的杯子总容量。(本来是前多少个杯子选i个,这里简化),所以三层循环dp。装的越多,所要倒的就越少,逆序遍历直到杯子容量满足即可。注意if判断条件,只能从初始状态开始选。#define _CRT_原创 2020-05-16 15:48:05 · 239 阅读 · 0 评论 -
HDU 5119 Happy Matt Friends(01背包)
题意:给出一串序列,选择任意数使得异或和大于m,求有多少种方法。For each test case, the first line contains two integers N, M (1 ≤ N ≤ 40, 0 ≤ M ≤ 10 6).In the second line, there are N integers ki (0 ≤ k i ≤ 10 6), indicating the...原创 2020-04-24 17:15:40 · 142 阅读 · 0 评论 -
CodeForces 366C Dima and Salad (背包dp)
题意:给出n件物品,每件物品都有a、b两个值,从中取几件使得其中a值总和最大,并且a的和等于k倍的b的和。The first line of the input contains two integers n, k (1 ≤ n ≤ 100, 1 ≤ k ≤ 10). The second line of the input contains n integers a 1, a 2, …, a...原创 2020-04-21 15:59:37 · 202 阅读 · 0 评论 -
UVA 1471 Defense Lines (LIS变形)
题意:删除原序列中的一段连续子序列,使得剩下的序列中存在一段最长连续子序列。题解:LIS变形我们用l[i]l[i]l[i]和r[i]r[i]r[i]记录往右以iii结尾和往左以iii开头的最长连续上升序列的长度。删除相当于选两段连续子序列组成LIS,遍历的话就是n2n^2n2,我们可以采用LIS一样的优化方法优化到nlognnlognnlogn。对于第iii个元素a[i]a[i]a[i],要...原创 2020-04-18 12:29:44 · 152 阅读 · 0 评论 -
HDU 6170 Two strings (dp)
题意:给出a、b两串,a为正常串,····明天写题解:dp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<queu...原创 2020-04-17 22:56:01 · 122 阅读 · 0 评论 -
CodeForces 808E Selling Souvenirs (超大01背包)
题意:给出每个物品的重量和价值,求在不超重的情况下的最大价值。The first line contains two integers n and m (1 ≤ n ≤ 100000, 1 ≤ m ≤ 300000) — the number of Petya’s souvenirs and total weight that he can carry to the market.Then ...原创 2020-04-17 22:48:33 · 258 阅读 · 0 评论 -
POJ 2392 Space Elevator (多重背包)
题意:给出n种材料,每种材料给出单个高度,最大限制高度和数量,求最高能堆多高。题解:多重背包因为每个材料都有限制高度,我们先排个序。每种材料的高度是在前者叠加高度再累加上去的,所以将dp[a[i].maxh]dp[a[i].maxh]dp[a[i].maxh]的值都赋值给后面一个材料。#define _CRT_SECURE_NO_WARNINGS#include<iostream&...原创 2020-04-17 22:34:57 · 155 阅读 · 0 评论 -
UVA 10534 Wavio Sequence (nlogn的LIS)
题意:求给出序列中长为2n+1的最长子序列,前n+1为严格上升,后n+1为严格下降。题解:nlogn的LIS从左往右,从右往左处理LIS,再遍历。用二分,复杂度为nlogn。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#inclu...原创 2020-04-17 22:21:34 · 120 阅读 · 0 评论 -
LightOJ 1079 Just another Robbery (概率dp+背包)
题意:有n家银行,每家银行都有一定数量的钱和被抓概率,给出自己被抓概率的上限,求能获得最多的钱。题解:概率dp+背包用dp[]dp[]dp[]表示获得这么多钱被抓的概率。获得同等钱的概率要尽可能小。设去A银行被抓概率为P(A),B银行为P(B),那么P(A∪B)=P(A) + P(B) - P(A)P(B)。然后跟01背包差不多,去求获得iii钱的最小概率就可以。double类型mems...原创 2020-04-14 10:06:42 · 201 阅读 · 0 评论 -
POJ 1015 && UVA 323 Jury Compromise (背包dp)
题意:给出n个人,每人有a和b两个值(0到20之间),从中选择m(1到20)个人出来,使得这m个人的a值和与b值和之差最小,输出a值和、b值和、人员编号。若不唯一,输出总和最大的方案。题解:dp因为是和作差的绝对值最小,所以会有负值,让dp[0][m∗20]=0dp[0][m * 20] = 0dp[0][m∗20]=0,就相当于向右平移,避免越界。这边不能直接算a和b的差绝对值,因为是先求...原创 2020-04-12 16:22:24 · 168 阅读 · 0 评论 -
CodeForces 1133E K Balanced Teams (dp)
题意:给出一个序列,选出至多k组,每组的元素间相差不超过5,可以不包含所有元素,求最多能包含多少个元素。题解:dp先排序。dp[i][j]dp[i][j]dp[i][j]:前iii个元素分成jjj组所能包含的最多元素数量。然后对于第iii个元素:选:dp[i][j]=dp[i−1][j]dp[i][j] = dp[i - 1][j]dp[i][j]=dp[i−1][j]。不选: dp[...原创 2020-04-11 15:37:55 · 131 阅读 · 0 评论 -
CodeForces 176B Word Cut (dp)
题意:给出a串和b串,有k次操作,每次操作将a串分割成两份,并将后一个子串接到前面,求有多少个这样不同的过程。题解:dp打王者,每天写题解。(逃#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring>...原创 2020-04-10 22:34:27 · 162 阅读 · 0 评论 -
UVA 11584 Partitioning by Palindromes (dp)
题意:将字符串分割成回文子串,求最小分割数。题解:dp如果jjj到iii是回文串,dp[i]=dp[j−1]+1dp[i] = dp[j - 1] + 1dp[i]=dp[j−1]+1。这边预处理了所有子序列是否构成回文串。(也可以不#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>...原创 2020-04-10 21:54:04 · 113 阅读 · 0 评论 -
CodeForces 10D LCIS (dp)
题意:求两个序列的最长公共上升子序列。输出路径。题解:dp记录b[]b[]b[]的子序列。a[i]!=b[j]a[i] != b[j]a[i]!=b[j]时:dp[i][j]dp[i][j]dp[i][j] = dp[i−1][j]dp[i - 1][j]dp[i−1][j]a[i]==b[j]a[i] == b[j]a[i]==b[j]时:dp[i][j]dp[i][j]dp[i][j]...原创 2020-04-10 11:54:01 · 163 阅读 · 0 评论 -
POJ 2479 Maximum sum (dp)
题意:求序列的两个连续子段的和最大。题解:dpl[]l[]l[]:保存当前元素之前的最大连续子段和。r[]r[]r[]:保存当前元素之后的最大连续子段和。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstr...原创 2020-04-10 10:25:48 · 159 阅读 · 1 评论 -
HDU 1160 FatMouse's Speed (dp)
题意:给出一个集合,每个元素包含www和sss两个数,求使www严格递增,sss严格递减的序列。题解:dp因为要输出序列,可以反向dp,正向输出。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring&g...原创 2020-04-09 17:32:49 · 110 阅读 · 0 评论 -
HDU 1257 最少拦截系统 (dp)
题意:求最小的分组数,使每组都是严格下降序列。题解:dp求下降的组数,相当于求LISLISLIS。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm...原创 2020-04-09 15:14:33 · 105 阅读 · 0 评论 -
HDU 1260 Tickets (dp)
题意:现在有n个人要买电影票,如果知道每个人单独买票花费的时间,还有和前一个人一起买花费的时间,问最少花多长时间可以全部买完票。时间从8:00:00开始。题解:dp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<c...原创 2020-04-09 11:32:13 · 89 阅读 · 0 评论 -
HDU 1176 免费馅饼 (dp)
题意:每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标:为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)题解:dpdp[i][j]dp[i][j]dp[i]...原创 2020-04-08 22:44:43 · 193 阅读 · 0 评论 -
HDU 1114 Piggy-Bank (完全背包)
题意:给出存钱罐没有钱时的重量和装满钱的重量,nnn种货币的单位价值和重量,求存钱罐里的最小价值。题解:dp完全背包。求最小,dp[0]dp[0]dp[0]置为0,其他置为infinfinf。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string&g...原创 2020-04-08 21:57:56 · 184 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping! (dp)
题意:求最大严格上升子序列之和。题解:dp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<queue>#i...原创 2020-04-08 21:15:43 · 150 阅读 · 0 评论 -
HDU 1069 Monkey and Banana (dp)
题意:nnn个不同规格长方体,求能垒多高,长宽严格递减。不同规格长方体数量不限。题解:dp按长宽排序,跟求LISLISLIS一样。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include<cstring>#include<algorithm>co...原创 2020-04-07 21:11:03 · 123 阅读 · 0 评论 -
HDU 1024 Max Sum Plus Plus (dp)
题意:给出mmm,将含有nnn个元素的数组分成mmm份子段,子段间可不连续,求最大子段和。题解:dp取前jjj个元素,分成iii段。可以得到转移方程为:dp[i][j]=max(dp[i][j−1]+a[j],dp[i−1][k]+a[j])dp[i][j] = max(dp[i][j - 1] + a[j], dp[i - 1][k] + a[j])dp[i][j]=max(dp[i][...原创 2020-04-07 10:12:03 · 170 阅读 · 0 评论