线性DP
常规的DP
为什么他们cf写的这么快
这个作者很懒,什么都没留下…
展开
-
cf1506 C. Double-ended Strings(DP,最长公共子串)
添加链接描述题意:给定两个字符串s1和s2,每次可以对两个字符串删除首字母或者末字母,求最少删除几个能使得s1和s2相等。思路:答案显然为len(s1)+len(s2)-max(LIS),有点水,算是复习一下求最长公共子串。#include<bits/stdc++.h>using namespace std;const int maxn=1e3+5;int T,dp[maxn][maxn]; int main(){ scanf("%d",&T); while(T-原创 2021-05-09 19:49:05 · 143 阅读 · 0 评论 -
cf1513 C. Add One(DP)
题目链接题意:给定初始整数n和操作数m,每一次操作都可以把n里的每个数字加1,问m此操作后n的长度是多少,比如n=1912,操作一次后就是21023,长度为5.思路:首先肯定不能暴力,我们可以发现每次使得长度增加的无非就是9->10这一部,但是如果直接定义dp【i】为操作次数i的长度好象不好转移。所以我们可以定义dp[i][j]代表初始数字为10时第i此操作,数位上有数字j的个数为dp[i][j],那么答案就是dp【i】【j】(j从0到9)的累加和也就是代码里的sum【i】,如果n为5,操作数原创 2021-04-19 16:42:35 · 248 阅读 · 0 评论 -
牛客每日一题——乌龟棋(多维DP)
输入9 56 10 14 2 8 8 18 5 171 3 1 2 1输出73说明小明使用爬行卡片顺序为1,1,3,1,2,得到的分数为6+10+14+8+18+17=73。注意,由于起点是1,所以自动获得第1格的分数6。思路:很典型的DP,太久没做都快没感觉了,dp【i】【j】【x】【y】代表卡片1用了i张,卡片2用了j张,卡片3用了x张,卡片4用了y张所得最大价值,转移看代码很容易看懂,注意一下起点dp【0】【0】【0】【0】是有价值的也就是a【0】。...原创 2020-07-25 22:22:27 · 146 阅读 · 0 评论 -
牛客每日一题 子序列(数学+动态规划)(好题)
题目链接思路:一开始确实也没往数学方面写,但是想化简指数,画着画着就发现了可以两边同时取个ln,于是问题就变成了ln(x)/x这个函数的单调递增的子序列个数,剩下的就是计数DP了,dp【i】代表以i为结尾的满足条件的子序列个数。(这里简单写一下公式的化简,两边同时取ln就变成了pj *ln(a[i])<pi *ln(a[j]),两边移项就是pi *ln(a[i])<pj *ln(a...原创 2020-04-28 21:55:10 · 203 阅读 · 0 评论 -
Codeforces Round #637 (Div. 2) - Thanks, Ivan Belonogov! (Dp+贪心)(好题*)
题目链接题意:这里一定要吐槽一下这场完全是个阅读理解题,这道题读了半天才读懂,非常的不友好,体验感极差。给你n个数位板,每个数位板由 7 个灯管组成给定 n 个数位板此时的状态,1 为亮 0 为暗,要求严格再点亮 k 个灯管(注意必须刚好为k,多一个少一个都不行),使得数位板上能够呈现出数字,且这个数字最大,如果无法呈现出数字,输出 -1,否则,输出操作后呈现的数字。思路:比赛的时候是...原创 2020-04-25 21:00:03 · 174 阅读 · 0 评论 -
Codeforces Round #518 (Div. 2) [Thanks, Mail.Ru!](计数DP)
题目链接题意:有一个长度为n的序列,满足对于所有的a[x],与它相邻的两个元素a[x-1]和a[x+1]中至少有一个大于等于它,其中a[1]和a[n]当然只有一个相邻元素, 现在这个序列中有些数字被破坏了(标记为-1),问有多少种合法恢复方案(每个数字∈[1,200])思路:dp[x][y][0/1/2]表示已经确定了第x个数字为y,且它左面那个数字a[x-1]小于/等于/大于它的总方案个数...原创 2020-04-15 20:16:48 · 133 阅读 · 0 评论 -
Codeforces Round #581 (Div. 2) D1. Kirk and a Binary String (easy version) (线性dp+构造)
题目链接思路:由于n很小,我们可以暴力枚举,假设s【i】为1,那么判断一下把s【i】变成0之后会不会对区间【i,n】的LIS产生影响,求LIS的过程线性dp就可以了。#include<bits/stdc++.h>using namespace std;int ans[2001][2],dp[2];void LIS(string s,int x,int k)//dp[0]表...原创 2020-02-27 21:29:53 · 140 阅读 · 0 评论 -
Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present
题目链接思路:变相求最长上升子序列求路径。#include<bits/stdc++.h>using namespace std;const int maxn=5e3+5;struct node{ int x,y,id;};vector<node>v;int deep=0,dp[maxn],pre[maxn];bool cmp(const node &a...原创 2020-04-02 21:42:58 · 123 阅读 · 0 评论 -
Codeforces Round #544 (Div. 3) E. K Balanced Teams(DP)
题目链接题意:有n个学生,每个学生有ai值,要求把学生分成不超过k组,同时一组内学生的ai值最大不能超过5,求能组队的最大学生数。思路:排序后,能组队的肯定是连续的数,dp【i】【j】代表前i个学生组成j个组的最大学生数,只要在第二层循环里找到满足条件的pos位置。#include<bits/stdc++.h>using namespace std;const int m...原创 2020-04-11 21:01:22 · 87 阅读 · 0 评论 -
Codeforces Round #156 (Div. 2) C. Almost Arithmetical Progression(DP)
题目链接思路:这个题有点难想的是dp的状态,dp【i】【j】代表子序列最后一个数是i,倒数第二个为j的长度。dp过程中用pos记录前一个相等的数的位置#include<bits/stdc++.h> using namespace std;typedef long long ll;const int maxn=4e3+1;int n,a[maxn],dp[maxn][max...原创 2020-04-03 19:37:42 · 129 阅读 · 0 评论 -
Codeforces Round #459 (Div. 1) B. MADMAX(博弈+DP+记忆化搜索)
题目链接思路:dp【i】【j】【k】表示先手为i,后手为j,前一轮的边权为k,然后进行dfs记忆化搜索。dp会定义基本就出来,想不到的话怎么也做不出来QAQ。#include<bits/stdc++.h>using namespace std;const int maxn=150; int dp[maxn][maxn][maxn];vector<pair<...原创 2020-03-05 21:02:33 · 179 阅读 · 0 评论 -
Technocup 2020 - Elimination Round 3 F1. Wrong Answer on test 233 (Easy Version)(DP)
题目链接#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MOD=998244353;ll dp[2020][4100],a[2020],b[2020],ans=0;int main(){ ll n,k; scanf("%lld%lld",&am...原创 2020-02-18 20:22:41 · 236 阅读 · 0 评论 -
Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(线性DP)
题目链接题意:给定初始序列,你可以选择一段区间将区间内所有的数乘以x,求最大连续子序列的和。思路:dp【0】代表当前的数不乘x,dp【1】代表当前正在乘x,dp【2】代表x已经乘完了。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=3e5+1; const l...原创 2020-04-11 21:11:33 · 118 阅读 · 0 评论 -
2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest J. Bottles(DP+思维)
题目链接题意:n 瓶水,每瓶水量 ai,容量 bi。要将所有水装到尽量少的瓶子内。每移动一单位的水要消耗一单位时间,在最少瓶子的前提下,问移动水所需的最短时间。思路:dp[i][j][k]代表前 i 个瓶子挑 j 个,它们总容量为 k 时最大的原有水量和。(用滚动数组优化一下)#include <bits/stdc++.h>using namespace std;type...原创 2020-04-11 20:29:08 · 216 阅读 · 0 评论 -
Codeforces Round #627 (Div. 3) E. Sleeping Schedule(DP)
题目链接思路:dp【i】【j】代表前i个睡觉时间为j的满足条件的个数。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e3+5;int ans=0,n,h,l,r,dp[maxn][maxn],a[maxn];int main(){ scanf("%d%d...原创 2020-04-08 21:32:58 · 101 阅读 · 0 评论 -
Codeforces Round #326 (Div. 1) B. Duff in Beach(DP+思维)
题目链接题意:给出一个有l个数的序列,序列每n个数一循环,在每个循环里取一个数,最多取m个数,要使得取出的子序列递增,求方案数。思路:可以将n*k个数按first排序,算一下这一层取这个数的贡献,dp【i】代表i的上一层满足条件的方案数,sum前前缀和。#include<bits/stdc++.h>using namespace std;typedef long long...原创 2020-04-07 22:10:04 · 148 阅读 · 0 评论 -
Codeforces Round #145 (Div. 2, ACM-ICPC Rules) F. Fence(DP)
题目链接题意:给出n个栅栏,需要涂上红色和绿色。红色的面积不能超过啊a,绿色的面积不能超过b。给出每个栅栏的高度,宽度都是1。所得的价值等于相邻栅栏不同颜色的面积(注意是相交的面积)。求最小的价值。思路:dp【i】【j】【0】代表第i个涂层红色,红色面积为j的最小代价,dp【i】【j】【1】代表第i个涂层绿色,红色面积为j的最小代价。#include<bits/stdc++.h&g...原创 2020-04-07 22:06:07 · 113 阅读 · 0 评论 -
Codeforces Round #237 (Div. 2) D. Minesweeper 1D(多维DP)(好题)
题目链接题意:一维的扫雷,"*"表示雷,“0”表示左右两边没有雷,“1”表示左右两边有一个雷,“2”表示左右两个都是雷,“?”表示不确定任意填(但是需要满足左右两个方格内的条件),先求方案数思路:dp【i】【0】代表i位有雷,左右任意,dp【i】【1】代表i位无雷,左右都无雷;dp【i】【2】代表i位无雷,左边有雷,右边无雷;dp【i】【3】代表i位无雷,左边无雷,右边有雷;dp【i】【4...原创 2020-04-07 22:03:41 · 172 阅读 · 0 评论 -
Codeforces Round #131 (Div. 1) C. Relay Race(棋盘DP)
题目链接题意:有n*n的方格,每个格子有一个数字,现在有两个人一个人从(1,1)走到(n,n)(但是他只能向右或者向下走)另外一个人从(n,n)走到(1,1)(他只能向左或者向上走),两个人每走到一个格子上就会累加上该格子内的分数,两个人走到同一个格子内时分数只累加一次思路:从(1,1)走带(n,n)和从(n,n)到(1,1)其实是一样的,那么dp【i】【j】【k】代表两个人都走了i步,第...原创 2020-04-07 21:57:24 · 193 阅读 · 0 评论 -
Codeforces Beta Round #10 D. LCIS(经典DP)
题目链接题意:给定两个串求最长公共上升子序列#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=505;int n,m,dp[maxn],a[maxn],b[maxn],pre[maxn];void dfs(int ans){ if(ans==0) return...原创 2020-04-07 21:54:33 · 150 阅读 · 0 评论 -
VK Cup 2012 Round 2 A. Substring and Subsequence(DP)
题目链接题意:给定两个串s1,s2,求s1的子串(连续)和s2的子序列(不连续)相同的个数思路:dp[i][j]表示s1从[1,i]的子串和s2从[1,j]的子序列中相同的个数。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=5e3+5; const int ...原创 2020-04-07 21:49:22 · 120 阅读 · 0 评论 -
Codeforces Round #162 (Div. 1) C. Choosing Balls(DP)
题目链接题意:有n个气球,每个气球都有一个价值和一种颜色。现在有q个询问,每次询问给个a、b,让你从原气球中按顺序取出一些气球。对于一个气球若前面一个气球和它的颜色相同那么加上这个气球的值乘a,其他情况(第一个气球或者前一个气球和它颜色不同)加上这个气球的值乘以b,求这个值最大是多少。思路:对于每种颜色的气球,它的价值要么*a,要么 *b,dp【i】记录每组颜色的最大价值。#includ...原创 2020-04-07 21:47:17 · 138 阅读 · 0 评论 -
Codeforces Round #239 (Div. 1) B. Long Path(DP+思维)(好题)
题目链接题意:起点为1,终点为n+1,对应第i个各点,如果我奇数次到达,那么下一步走到a【i】的位子,如果是偶数次到达,那么下一步走到a【i】+1的位子。问从1走到n+1一共需要走多少步思路:很有意思的一道题目,我们定义dp【i】为从起点走到i的步数,答案是dp【n】,那么dp要怎么转移呢?首先要明白由于pi<=i,从i-1走到i的话一定先往回走,最后再一步走到i,所有首先dp【i=...原创 2020-04-03 19:52:56 · 110 阅读 · 0 评论 -
Codeforces Round #116 (Div. 2, ACM-ICPC Rules) C. Letter(简单DP)
题目链接题意:给出初始字符串,你可以把一个大写变小写,小写变大写,代价都为1,要求字符串最后要变成所有大写字母都在所有小写字母旁边。比如AAAAaaaa思路:dp【i】【0】代表第i个字符变大写整个字符串满足要求的最小代价,dp【i】【1】代表第i个字符变小写整个字符串满足要求的最小代价.#include<bits/stdc++.h> using namespace std;...原创 2020-04-03 19:47:17 · 133 阅读 · 0 评论 -
Codeforces Round #273 (Div. 2) D. Red-Green Towers(DP+滚动数组优化)
题目链接题意:有两种颜色的积木 向上垒,每层只能是同一种颜色,且每层的个数等于层数。问有多少种垒法。思路:dp【i】【j】代表前i层用了j个红块的方案数,由于数很大,需要用滚动数组优化。...原创 2020-04-03 19:32:02 · 130 阅读 · 0 评论 -
Codeforces Round #261 (Div. 2) E. Pashmak and Graph(DP)
题目链接题意:给出m条边n个点每条边都有权值问如果两边能够相连的条件是边权值是严格递增的话,最长能接几条边。思路:dp【i】代表前i条边能满足条件的最大长度,g【i】代表以i点为结尾的最大长度。#include<bits/stdc++.h> using namespace std;typedef long long ll;const int maxn=3e5+1;co...原创 2020-04-03 19:30:01 · 111 阅读 · 0 评论 -
Codeforces Round #360 (Div. 1) C. The Values You Can Make(DP)
题目链接思路:dp【i】【j】代表硬币总数为i,子集和为j。当dp【i】【j】为真时,显然dp[i+a[k]][j]和dp[i+a[k]][j+a[k]]也为真。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1005;bool dp[maxn][maxn]={f...原创 2020-04-02 22:21:27 · 112 阅读 · 0 评论 -
Educational Codeforces Round 16 E. Generate a String(DP)
题目链接思路:dp【i】为构造长度为i的字符串的最小代价。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int maxn=1e7+1;const ll inf=1e18;ll dp[maxn]...原创 2020-04-02 22:14:04 · 104 阅读 · 0 评论 -
Codeforces Round #594 (Div. 1) A. Ivan the Fool and the Probability Theory(DP+数学)
题目链接题意:给定一个n*m网格,要求给格子涂色的时候每个格子与相邻的格子之间最多只有一个颜色相同,求有多少涂色方案。思路:感觉这个题更多的还是规律吧,首先你要明白一点就是如果某一行的涂色方案已经决定了,那么整个网格的涂色方案也就确定了,也就是规定了第一行的涂色方案后,它对答案的贡献。发现不了这个规律,这个题基本就是白给QAQ。知道了这个之后还是很简单的,我们要做的就是确定一行能用多少个涂...原创 2020-04-02 22:12:01 · 154 阅读 · 0 评论 -
Codeforces Round #165 (Div. 1) B. Greenhouse Effect(DP+最长上升子序列+思维)
题目链接思路:转换一下思维,我们考虑一下哪些数可以不用动,那么这个题就变成了求最长上升子序列的裸体了,答案就是n-LIS。#include<bits/stdc++.h>using namespace std;const int maxn=5e3+5;pair<int,double>a[maxn]; int n,m,dp[maxn],ans=0;int ma...原创 2020-04-02 21:40:46 · 147 阅读 · 0 评论 -
Codeforces Round #479 (Div. 3) F. Consecutive Subsequence(简单DP)
题目链接思路:由于数可能很大,用map来存每个每个数的最长连续子序列,路径的话只要枚举数就行了。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+1;map<int,int>dp,p;int n,a[maxn],ans=0;int main...原创 2020-04-02 21:38:14 · 109 阅读 · 0 评论 -
Codeforces Round #374 (Div. 2) C. Journey(拓扑+DP)(DAG上跑DP)
题目链接思路:dp【i】【j】代表1到i中经过j个点的最小花费。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=5e3+5;const int inf=1e9+1;int pre[maxn][maxn];int dp[maxn][maxn],ru[maxn]...原创 2020-04-02 21:33:22 · 190 阅读 · 0 评论 -
Codeforces Round #208 (Div. 2) D. Dima and Hares(三维DP)
题目链接思路:做这个题要理解就是喂兔子的时候最终不一定是1到n顺序着喂的,a,b,c数组是告诉你如果这样操作的话开心值是多少,所以我们定义dp【i】【0】【0】代表当前喂第i只兔子,这只兔子左右两边的兔子此时都没有喂的最大开心值,dp【i】【1】【0】代表当前喂第i只兔子,这只兔子左边的兔子此时都已经喂了,右边的没喂的最大开心值,dp【i】【1】【1】代表当前喂第i只兔子,这只兔子左边的兔子...原创 2020-03-31 19:41:22 · 126 阅读 · 0 评论 -
Codeforces Round #371 (Div. 1) C. Sonya and Problem Wihtout a Legend(DP+思维)
题目链接题意:给定一个初始数组,你每次操作可以选择数组中的一个数进行加1或者减1操作,问你最少要多少操作使得数组变成严格单调。思路:感觉这个题思路完全想不到,我们将初始数组都执行a【i】=a【i】-i操作,然后我们思考一下这个修改成这样会有什么好处,修改后如果存在方案使得数组所有数都等于x(假设为x),那么我们最终答案的最小操作是不是就是等于a【i】变成x的步数累加起来?于是我们就可以枚举要...原创 2020-03-31 19:32:53 · 136 阅读 · 0 评论 -
Codeforces Round #267 (Div. 2) C. George and Job (DP+思维)
题目链接思路:dp[i][j]表示前i个元素有j个长度为m区间的最大值 ,那么dp【i】【j】就有两个状态可以转移,一个就是第i个数不包括长度为m的区间内,另外就是包含在以第i个数为结尾的长度为m的区间。#include<bits/stdc++.h> #define ll long longusing namespace std;const int maxn=5e3+5; ...原创 2020-03-31 19:17:12 · 152 阅读 · 0 评论 -
Codeforces Round #367 (Div. 2) C. Hard problem(DP)
题目链接思路:dp【i】【0】代表第i个字符串不反转满足要求的最小花费,dp【i】【1】代表第i个字符串反转后满足要求的最小花费。那么dp【i】【0】和dp【i】【1】就由四个状态转移,具体看代码。#include<bits/stdc++.h> #define ll long longusing namespace std;const int maxn=1e5+5; c...原创 2020-03-31 19:13:22 · 138 阅读 · 0 评论 -
Codeforces Round #369 (Div. 2) C. Coloring Trees(三维DP)
题目链接题意:给你一列树,有n颗。给你m种颜色,这一列树中有些已经被涂好颜色了,但有些没有涂颜色。现在要给这些没有涂颜色的树上色,对于第i颗树,要涂第j种颜色,需要消耗p[i][j]的颜料。定义这一列树的美丽值为连续相同颜色段的段数。问使得美丽值为k的所需消耗的颜料的最小值。思路:dp[i][j][k]代表前i棵树分成k组,第i棵为j色的最小价值,考虑一下这个dp的转移,其实就与前一棵树的...原创 2020-03-31 19:00:27 · 117 阅读 · 0 评论 -
Codeforces Round #Pi (Div. 2) C. Geometric Progression(dp+算贡献)
题目链接思路:考虑一下每个数对答案的贡献,对第i个数a【i】如果是k的倍数的话,那么a【i】的贡献就是前面a【i】/k的数个数,dp【i】代表【1,i-1】中a【i】/k的个数。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+1;ll dp[maxn],...原创 2020-03-31 18:56:16 · 106 阅读 · 0 评论 -
Educational Codeforces Round 19 E. Array Queries(DP+思维)(妙题)
题目链接题意:给定初始数组a,m个询问,每次询问给出q和k,定义每次操作q=q+a【q】+k,求多少次操作后q>n。思路:超棒的思维题,自己还在那怎么想莫队,我们可以发现我们其实可以把k的操作给变小的,我们先求出k小于sqrt(maxn)的时候,k不超过350,那么我们定义一下dp【i】【j】表示q为i,j为k时的最小操作次数,转移方程为dp【i】【j】=dp【i+a【i】+j】+1,...原创 2020-03-30 21:53:04 · 107 阅读 · 0 评论 -
Codeforces Round #276 (Div. 1) D. Kindergarten(DP+思维)
题目链接#include<bits/stdc++.h> #define ll long longusing namespace std;const int maxn=1e6+1; ll dp[maxn][2],a[maxn];int n;int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) scanf("...原创 2020-03-30 21:45:36 · 92 阅读 · 0 评论