dp
小菜鸡加油
菜鸡
什么都能折磨
展开
-
P3426 [POI2005]SZA-Template(kmp+dp)
https://www.luogu.com.cn/problem/P3426这题出得挺好的,代码量简洁但是却有一定思维量。先说一下暴力做法,不难看出如果要完成这一工作,必然和前后缀有关,如果当前i的前后缀存在交叉,那么这一段一定可能成为答案。若不交叉,则需要知道前缀被组成的串数,由于前缀可以被组成,前缀=后缀,所以后缀也可以被组成。因此我们关心中间的这一段能否被组成。先说一下自己开始的错误dp想法。我开始是判前缀被组成的子串长度*2>=前缀即可转移。其实这个做法不能判断中间的一段是否能被组成。原创 2021-11-03 20:17:40 · 210 阅读 · 0 评论 -
C. Portal(dp优化二维前缀和)
https://codeforces.com/contest/1581/problem/C正常的第一想法是:二维前缀和预处理+暴力。但是n是400过不去。之前碰到一道利用最大子序和思想来优化的。这题类似。采用dp来优化。枚举两行 ,再枚举1列。对列进行dp。dp[k]:当前到k列的最小花费(注意这里是不包含第k列的)【后面解释】f[k]=min(f[k−1]+加入第k行需要的修改次数,以i、j、k−3、k为边界的矩阵的修改次数)每次用当前的f[k]+右边界需要的修改次数更新ans。先解原创 2021-10-30 18:51:49 · 219 阅读 · 0 评论 -
E. Funny Game(博弈类dp+前缀和倒序)
1.要观察到整体式子的总和是不会发生变化的。因为每次拿掉后又把该一段的和放回去。因此可以前缀和处理2.发现第一次取最后一个位置直接结束游戏,第二次取前面的一些位置后,如果知道该位置后面的最优解,就可以直接转移。提示发现是倒序处理。即dp[i]的解可以由dp[i+1]更新过来dp[i]:Alice取/不取i位置获得的最终的最大差值.3.对于Alice的dp[i]的最大差值,那么如果Alice取i了,dp[i+1]是Alice在[i+1,n)的最大差值。Bob很聪明,所以直接沿用这个结果就可以(因为这个结原创 2021-08-17 00:06:29 · 115 阅读 · 0 评论 -
H. Subsequences (hard version)(dp)
https://codeforces.com/problemset/problem/1183/H思路:求长度为前k长的本质不同的子序列,那么找出每个长度对应有多少个本质不同的子序列即可。考虑求本质不同的子序列串数量dp[i][j]:前i个里长度为j的本质不同子序列数量首先是第i个继承过来 dp[i][j]+=dp[i-1][j]但是第i个加到之前的子序列里可能会重复。dp[i][j]+=dp[i-1][j-1]那么观察到找到其前面最后面的重复位置,删除后就不重复了。i..原创 2021-05-23 15:47:45 · 140 阅读 · 0 评论 -
D - aab aba baa(dp)
https://atcoder.jp/contests/abc202/tasks/abc202_d思路:后往前考虑当前位取不取1,然后取得话我要知道这时候放了1,然后这个用了多少的部分用dp求。dp[i][j]:到前i个且有j个1的总数。考虑第i位是1还是0#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#incl原创 2021-05-22 22:34:15 · 266 阅读 · 2 评论 -
D. Armchairs(dp+贪心)
https://codeforces.com/contest/1525/problem/D思路:两个人的移动轨迹如果交叉了不会变优。若两个人在位置x,y,x移动到p,y移动到q,不妨设:若q<x<y<p,则y-q+p-x不如x-q+p-y;若x<q≤p<y,则p-x+y-q不如q-x+y-p。若x<y<p<q,则p-y+q-x=p-x+q-y因此对于最后一个人转移,将其定于上一个位置之后的任意一个空位置可以获得不会更差的状态.原创 2021-05-20 00:37:21 · 320 阅读 · 0 评论 -
[JSOI2015]地铁线路(虚拟源+最短路图+dp)
https://www.luogu.com.cn/problem/P6096思路:好题。开始先考虑最小代价的计算。如果不考虑时间,我们可以对每个点建完全图。然而空间和时间都不够。虚拟源。开始不考虑第二问的话,可以建如下图的虚拟源绿色的要付1r,黄色不要钱。理解为上了车这一站付一次就好,一旦下车就要重新付。如此我们跑一个dijkstra,便可解决第一问。图源:https://ac.nowcoder.com/profile/919101813l好,那么第二问如何解决。首先考虑原创 2021-05-13 19:27:56 · 308 阅读 · 2 评论 -
P4574 [CQOI2013]二进制A+B(dp数位+贡献)
https://www.luogu.com.cn/problem/P4574设dp[i][j][k][t]表示,当前在第i位(从右往左数),C填了j个,A填了k个,B填了t个的能凑出满足条件的最小的数。但是这题存在进位,所以我们还要开一维处理进位的情况。注意我们对答案的贡献只考虑手动给C的第i位填1才算贡献。然后讨论,当前AB两位是否对C位产生进位。考虑AB两位不进位:1.A,B都是0,且后一位不进1=>现在这一位就是02.A,B都是0,且后一位进1=>现在这一位就是13原创 2021-05-11 21:13:17 · 148 阅读 · 0 评论 -
E. Phoenix and Computers(组合+计数dp)
https://codeforces.com/problemset/problem/1515/E思路:首先会发现结果的序列方案数会是一段连续的,一个空的,一段连续的,那我们要先知道一段连续的方案数是多少。枚举从哪一台电脑开始打开如果从 1开始,那么剩下的必须按照2,3,…,n的顺序打开。(如果不按照这个顺序,就会有电脑自动开启) 方案数为1如果从2开始,那么2 的右边必须按从左往右的顺序开启,即3,4,…,n而1可以在这其中任意时刻开启。 后面那么多数的位置插一个空 C...原创 2021-05-05 17:46:31 · 249 阅读 · 0 评论 -
CCA的区间(思维+状压/sosdp)
https://ac.nowcoder.com/acm/contest/11168/E思路:可以反转一个区间代表着可以将任意两个连续的区间拼接在一起于是问题就变成了选两个不相交的最大子区间的和最大是多少。考虑到值是log级别的,转化到值上去。把一个合法区间的状态看成二进制,进行状压。由于指数级别,所以最多第二个for最多跑24次就结束了。于是可以nlogn处理出序列里所有的二进制数。问题就变成了求两个数x,y, x&y==0的条件下x^y的最大值。于是预处理每个二进制状.原创 2021-03-24 20:13:42 · 137 阅读 · 0 评论 -
搬寝室(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=1421思路:直接去想根本没法做。而且每一个选择的顺序是2^k,可以发现大致是个dp问题。但是没法划分阶段。先sort方便思考。sort后利用贪心可以发现。如果i要拿,一定要i-1配套,不然和其他拿会更差。(可以交换相邻证明)因此可以变成一个选i或者不选i的线性dp#include<iostream>#include<vector>#include<queue>原创 2021-05-02 12:45:55 · 193 阅读 · 0 评论 -
P4280 [AHOI2008]逆序对(dp)
https://www.luogu.com.cn/problem/P4280思考:直接去dp很难转移。但是这个题有个结论。填的数一定是满足不严格单调上升序列,不然答案会更差。不妨设a<b,序列为: a,.....,b,记中间部分为L原来的逆序对数量为a在前b在后:count(L,<=a)+count(L,>=b)交换a,bb在前a在后:count(L,<=b)+count(L,>=a)其中L内的逆序对数量一样画出数轴可以得出a&l原创 2021-05-02 12:40:25 · 178 阅读 · 0 评论 -
E. Generate a String(dp)
https://codeforces.com/problemset/problem/710/E思路:挺有意思的一道题。直接去想的话会发现删除是有后效性的。但是先奇偶讨论可以得知,对于当前点是偶数,如果后面更新过来不如前面一个减掉再乘。因此对于偶数不用考虑后来的。于是对于奇数的后效性考虑,奇数的后面一个是偶数,可以从前面一个乘到后面再减来更新这个点的dp状态。#include<iostream>#include<vector>#include<queue&g原创 2021-05-01 15:51:16 · 499 阅读 · 2 评论 -
D. 505(状压dp)
https://codeforces.com/problemset/problem/1391/D思路:我记得这个题我似乎去年碰到了。当时看了一眼就扔了。今年给补上了。这个题有个结论。就是n>=4&&m>=4的时候是-1的。所以不用存图。能找到的最小的子矩阵应该是2 * 2 ,如果一个2 * 2矩阵内含有奇数个1,那么四个2 * 2矩阵拼接形成一个4 * 4矩阵中肯定就含有偶数个1,所以如果n和m同时大于等于4,那么一定无法构造出符合题意的矩阵.那么手动模拟一下可以原创 2021-04-30 20:47:40 · 197 阅读 · 2 评论 -
C. Array Beauty(dp好题)
https://codeforces.com/contest/1188/problem/C思路:那部分差分没懂干净阿....郁闷参考:https://www.luogu.com.cn/problem/solution/CF1188Chttps://blog.csdn.net/weixin_44178736/article/details/107777918?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&a原创 2021-04-26 19:17:28 · 160 阅读 · 0 评论 -
C. Garland(记搜版本)
https://codeforces.com/contest/1287/problem/C思路:上次是用递推做的..这一次用记忆化做。两者感觉有一点不同,记搜来说代码可以更简短一点,而且是对于当前的状态,暴力dfs跑完之后可能的所有状态,然后回来的时候把最优答案比较出来然后记住。和下面这个传送的先处理好边界然后再跑各有妙处。传送#include<iostream>#include<vector>#include<queue>#include<原创 2021-04-21 15:35:34 · 108 阅读 · 0 评论 -
2B - The least round way(dp)
https://codeforces.com/problemset/problem/2/B思路:其有个点就是2和5中分别dp,取最小的一个,答案一定满足最小的那个。假设2的最少个数是4,意味着所有路其能走出一条4来,而此时5的最少个数是7,那么选走出4来的那条路优。#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>原创 2021-04-14 18:31:02 · 98 阅读 · 0 评论 -
F. Tree with Maximum Cost(换根dp)
https://codeforces.com/problemset/problem/1092/F思路:奶牛聚会的原题#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<al原创 2021-04-13 21:14:08 · 91 阅读 · 0 评论 -
C. Add One(dp)
https://codeforces.com/contest/1513/problem/C思路:第一发tle。因为没看到他是t组也算进去的。#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>原创 2021-04-12 19:01:36 · 388 阅读 · 0 评论 -
540D - Bad Luck Island(思维+概率dp)
https://codeforces.com/problemset/problem/540/D思路:n=100,给2s...有点麻dp[i][j][k]表示剩下i个A,j个B,k个C的概率。对于概率,就是该事件发生的总和/总事件。每一次总事件为i*j+j*k+k*i;发生对应少人事件为一个和。#include<iostream>#include<vector>#include<queue>#include<cstring>.原创 2021-04-07 23:50:57 · 74 阅读 · 0 评论 -
1197D - Yet Another Subarray Problem(思维+dp)
https://codeforces.com/problemset/problem/1197/D参考:https://blog.csdn.net/cheng__yu_/article/details/106364218?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242没懂干净。留坑#include<iostream>#include<原创 2021-04-07 17:49:57 · 122 阅读 · 0 评论 -
459E - Pashmak and Graph(思维+DAGdp+同时转移)
https://codeforces.com/problemset/problem/459/E思路:有向图,此题的topo序为边权。sort后之后定义dp[i]为到i点的最长路。由于是sort过的,所以dp[i]从前一条边的终点转移过来是没问题的。但是会存在相同边权的问题。比如1->3(1) 3-->4(1) 如果按照顺序更新dp,那么后者的1会在前者的1的基础上+1;所以我们要把同一边权的放到一起,统一更新好之后再放回去。#include<iostream>#.原创 2021-04-07 16:10:29 · 86 阅读 · 0 评论 -
479E - Riding in a Lift(dp+前缀优化)
https://codeforces.com/problemset/problem/479/E思路:开始以为反复跳会有后效性..是我理解错了..在dp的第i次和第i-1次是不存在后效性的。定义dp[i][j]表示第i趟的时候到第 j 楼层的方案数。转移方程dp[i][j] += dp[i-1][k] (k = 1,….,n)然后是n^3。优化,发现对于j可以转移的地方是一整段的,可以前缀优化。注意最后要把上一层也在j楼层的情况减了。#include<iostream&原创 2021-04-07 10:26:24 · 88 阅读 · 0 评论 -
505C - Mr. Kitayuta, the Treasure Hunter(思维+dp偏移量优化)
https://codeforces.com/problemset/problem/505/C思路:开始想着dp,但是dp[3e4][3e4]肯定炸了阿。但是发现由于最大步长是1+2+3+...a+250 > 30000。所以第二维最多在第一次的d的基础上上下浮动250(其实还没那么多),于是第二维开500就够了。所以把第二维改成对初始跳跃长度d的偏移量。偏移量会是减的嘛,所以我们还要加一个类似mod让原点偏移。让原本的和初始距离d的0偏移量现在变成250的偏移量。那么假如是在原创 2021-04-05 20:57:45 · 216 阅读 · 0 评论 -
463D - Gargari and Permutations(思维+dp多个串的LCS)
https://codeforces.com/problemset/problem/463/D思路:因为序列为排列,设dp[x]以x结尾能得到最长的LCS. 当x出现k次时,说明x能作为结尾,枚举能接在其前面的数即可 O(k*n^2)。#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<ma.原创 2021-04-04 10:59:24 · 131 阅读 · 0 评论 -
1036C - Classy Numbers(数位dp)
https://codeforces.com/problemset/status?思路:板子#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>原创 2021-04-03 17:30:35 · 86 阅读 · 0 评论 -
766C - Mahmoud and a Message(dp)
https://codeforces.com/problemset/problem/766/C有一个长度为n的字符串,第二行有26个数字,位置1~26对应为a~z的字母,数值表示该字母不能出现在长度超过该值的子串中。///求有多少种划分该字符串的方法求该字符串划分成子串后最大的子串的长度求该字符串划分成满足要求的子串需要至少划分多少次思路:dp[i]定义到i的答案,枚举最后一段的长度用以划分#include<iostream>#include<vector&g.原创 2021-03-31 01:07:02 · 118 阅读 · 0 评论 -
C.Planar Reflections(思维+记忆化搜索)
https://codeforces.com/contest/1498/problem/C思路:把一个点产生的贡献,看成一个为向左反射血量-1的贡献+一个继续向右血量不变的贡献。直接dfs超时,上记忆化#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<se原创 2021-03-30 19:35:41 · 367 阅读 · 0 评论 -
涛酱和策策的游戏again(by良心出题人wzc)(思维+状压dp)
https://ac.nowcoder.com/acm/contest/12482/D题意:https://blog.csdn.net/zstuyyyyccccbbbb/article/details/115171072在原题的基础上进行了限制一些点不可放置。思路:对这些不可放置的结合到预处理的st[]中去。这里需要将st[][]开成二维,记录第i列,j状态的可行性。细节:1.将不可存放转化成二进制数累加(记为temp),遍历所有进行【状态&temp】,如果==1即说明包含了不.原创 2021-03-24 16:45:17 · 133 阅读 · 0 评论 -
291. 蒙德里安的梦想(思维+状压dp)
https://www.acwing.com/problem/content/description/293/思路:一个很重要的点就是放好合法的横块之后,竖块的摆放就确定了。于是枚举每一列的状态,用二进制表示。j为上一列的状态,k为此列的状态。可以知道,j&k==0 并且j|k的每段连续0的个数是偶数是符合的。于是j|k的每段连续0的个数是偶数的符合的状态在每一个列的状态是一致的。提前预处理就好。if( (j&k)==0 &&(st[j|k] )d原创 2021-03-24 12:21:50 · 245 阅读 · 0 评论 -
机器人(状压dp/贪心)
https://ac.nowcoder.com/acm/contest/9986/G思路:范围很小,爆搜超时,于是状压dp。当然如果范围大了是个贪心的操作#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstd原创 2021-02-28 12:32:18 · 147 阅读 · 0 评论 -
2021牛客寒假算法基础集训营5 树上博弈(结合博弈状态的dp+有关树的状压dp)
思路:参考文章:https://blog.nowcoder.net/959548301qwq看到n≤20考虑状压dp。dp[s]表示当前点集为s,先手比后手高多少分。如果此时里面只有一个点的话,显然答案就是那个点的权值。否则的话枚举下一步操作是什么,假设选的点是i,dp[s∪{i}]的状态就可以由dp[s]来更新。就是一个顺推的dp思路,当前的s可以更新哪些状态。然后转移的权值是a[i]−dp[s]。这里就是博弈类型dp的一个思路。因为先手得到了ai,之后后手的...原创 2021-02-25 17:16:20 · 133 阅读 · 0 评论 -
F. 膜方俱乐部(tarjan缩点+dfs记忆化)
题目描述:第一行为一个正整数 N。第二行有N个非负整数A[i],表示了每个分部的orzFang价值。第三行有N个正整数F[i],表示通过第i个分部的虫洞所到达的分部为 F[i],可能出现 F[i]=i的情况。求:从第 i 个分部出发,orzFang 价值之和的最大值为多少。101 1 1 1 1 1 1 1 1 17 4 5 3 9 1 10 3 4 57544486545思路:tarjan缩点。对于缩点后我们发现只会是一条链子。但是直接每个点dfs是O(n原创 2021-01-30 15:20:14 · 126 阅读 · 0 评论 -
D. 烽火传递(暴力dp+单调队列优化)
思路:看着像个和滑动窗口有关的,但是n,m只有200,所以这题不用单调队列优化。dp[i]:点亮第i个烽火台的最小花费。dp[i]=min(dp[j(i-1~i-m)]+a[i],dp[i]);最后取值在dp[i~i-m+1]中取一个最小的。初始化在dp[i:1~m]=a[i]#include<iostream>#include<vector>#include<queue>#include<cstring>#include<...原创 2021-01-20 22:32:00 · 224 阅读 · 0 评论 -
C - Longest Regular Bracket Sequence(思维+括号匹配+dp)
在做光光oj的比赛碰到了这题..发现是道cf的原题。思路:首先要解决括号匹配的问题,也就是用stack模拟,看当前的)有无(对应。有的话需要记录到这个点的拥有的最长子串数,需要dp更新。dp[i]=max(dp[i],dp[pos(top的位置)-1]+(i-top+1)/2];然后动态更新最值的个数。#include<iostream>#include<vector>#include<queue>#include<stack>#incl..原创 2021-01-20 22:03:35 · 331 阅读 · 0 评论 -
Doing Homework hdu1074(状压dp)
Description马上假期就要结束了,zjm还有 n 个作业,完成某个作业需要一定的时间,而且每个作业有一个截止时间,若超过截止时间,一天就要扣一分。zjm想知道如何安排做作业,使得扣的分数最少。Tips: 如果开始做某个作业,就必须把这个作业做完了,才能做下一个作业。Input有多组测试数据。第一行一个整数表示测试数据的组数第一行一个整数 n(1<=n<=15)接下来n行,每行一个字符串(长度不超过100) S 表示任务的名称和两个整数 D 和 C,分别表示任务的截止时原创 2020-11-10 20:28:29 · 109 阅读 · 0 评论 -
P1833 樱花(混合背包+二进制优化板子)
https://www.luogu.com.cn/problem/P1833思路:首先比较容易想到是取和不取的背包问题,其次发现里面有完全背包和多重背包。所以朴素的做法就是当前物品是多重背包时候,用多重背包的解法,当前背包是完全背包时候,用完全背包的解法。这样会T两个点。当然你开O2可以过,但是没必要。#include<iostream>#include<vector>#include<queue>#include<cstring>#in原创 2020-10-08 16:52:07 · 163 阅读 · 0 评论 -
A. Garland(线性dp)
https://codeforces.com/problemset/problem/1286/A// cin.tie(0);std::ios::sync_with_stdio(false);// LL n;cin>>n;// for(LL i=1;i<=n;i++){// cin>>a[i];// }// memset(dp,0x3f,sizeof(dp));// dp[1][1]=dp[1][0]=0;// for(LL i=2;i<原创 2020-08-20 22:24:26 · 250 阅读 · 0 评论 -
younik吃大餐
链接:https://ac.nowcoder.com/acm/contest/7031/G来源:牛客网题目描述Younik的检查结果出来了,核酸检测为阴性,她非常高兴,立刻决定去饭店大吃一顿。到了饭店,Younik看到琳琅满目的菜单,开始犯了选择困难症。这时作为顶级吃货的你恰好坐到了Younik的旁桌,你决定发扬一下雷锋精神,帮助Younik决定吃哪些菜。假设每一道菜都有相应的快乐值,Younik每吃一道菜就会获得相应的快乐值,这里有N道菜,每道菜可以吃多次,但是同一道菜每重复吃一次,得到的.原创 2020-08-16 21:17:04 · 179 阅读 · 0 评论 -
Coloring Trees
CodeForces – 711Chttps://www.luogu.com.cn/problem/CF711C题目描述ZS the Coder and Chris the Baboon has arrived at Udayland! They walked in the park wherenntrees grow. They decided to be naughty and color the trees in the park. The trees are numbered wit..原创 2020-08-07 19:06:02 · 290 阅读 · 0 评论