
dp
scau_sleep(今天写bug了吗?
1.一个退役acmer,老年选手
2. 今天喝水了吗?
3. 会写暴力~比不会写强~比不会写优秀
4.不会三分,喜提铁牌。
5. 失败一次不算什么,胸针为了拯救真由里 和 助手。重来3000多次都可以,那我失败几次,又算什么。(命运石之门)
-------如果说这是命运石之门的意志的话
展开
-
基础dp kuangbin专题题目 一览
基础dp1 Max Sum Plus Plus HDU - 1024线性dp,最大子段和的变种。开两维数组 题解传送门2 Ignatius and the Princess IV HDU - 1029分明就是离散化的模板, 放在dp专题。。。。。 传送门3. Monkey and Banana HDU - 1069 题解 传送门 和这道题一模一样,换了个名字而已...原创 2021-02-14 19:17:34 · 245 阅读 · 0 评论 -
紫薯第9章动态规划,从入门到入土(acwing部分)
闫氏dp分析法:1. 数字三角形 模型2. 最长上升子序列 模型原创 2021-02-10 01:22:16 · 152 阅读 · 0 评论 -
紫薯第9章动态规划,从入门到入土(acwing部分)---数字三角形部分
eg1 摘花生思路O(n2n^2n2):就是数字三角形的模板题# include <bits/stdc++.h>using namespace std;int f[110][110];int n, m;int main(){ int t; scanf("%d", &t); while(t--){ scanf("%d%d", &n, &m); for(int i = 1;i <= n; i ++原创 2021-02-10 01:21:34 · 225 阅读 · 0 评论 -
AtCoder Beginner Contest 273 F - Hammer 2(离散化&&dp)
AtCoder Beginner Contest 273 F - Hammer 2 离散化&&dp原创 2022-10-16 17:15:51 · 281 阅读 · 0 评论 -
Codeforces Global Round 23 D. Paths on the Tree(树型dp)
Codeforces Global Round 23 D. Paths on the Tree 树型dp原创 2022-10-16 12:45:33 · 506 阅读 · 1 评论 -
Codeforces Round #826 (Div. 3) G - Kirill and Company(状压dp&&bfs)
Codeforces Round #826 (Div. 3) G Kirill and Company 状压dp, bfs原创 2022-10-12 20:27:17 · 423 阅读 · 0 评论 -
8601 最大长方体问题(优先做)简要题解
题意:本题其实是最大子段和的三维版本。思路:二维版本 AcWing 126. 最大的和(最大子矩阵和)在二维的启发下,我们可以枚举高度 去求子段和。转移:dp[h][x1][x2][y1][y2]=max(0,dp[h−1][x1][x2][y1][y2]+pre[x2][y2]−pre[x2][y1−1]−pre[x1−1][y2]+pre[x1−1][y1−1]);dp[h][x1][x2][y1][y2] = max(0, dp[h-1][x1][x2][y1][y2] + pre[x.原创 2021-12-13 12:30:30 · 738 阅读 · 0 评论 -
edu116 e 简要题解
原创 2021-10-30 00:52:52 · 86 阅读 · 0 评论 -
子序列dp
题意:求子序列的个数,且要求子序列里相邻的元素 在 原串里不能相邻思路:朴素的子序列dp[i]=∑j=ki−1dp[j]dp[i] = \sum_{j = k}^{i-1}dp[j]dp[i]=∑j=ki−1dp[j](其中s[k]==s[i]s[k] == s[i]s[k]==s[i])ans=∑dp[i]ans = \sum dp[i]ans=∑dp[i](iii表示以iii结尾的子序列个数)本题的 不相邻条件把dp[i]dp[i]dp[i] 改成dp[i+1]=∑j=ki−1原创 2021-08-15 20:58:43 · 100 阅读 · 0 评论 -
2000dp
296B: 巧妙利用二进制(减少分类讨论,少写if直接循环搞定)代码 41D:路径dp,利用mod的性质减少状态 代码原创 2021-07-06 17:18:11 · 165 阅读 · 0 评论 -
ABC208E(bug代码。。。。qwq。。。qwq)(顺便学习了下如何使用内部类)
#include <string>#include <map>#include <iostream>#include <algorithm>#include <bits/stdc++.h>#include <cstring>#define For(i,x,y) for(int i = (x); i <= (y); i ++ )typedef long long LL;using namespace std;LL原创 2021-07-05 00:18:04 · 109 阅读 · 0 评论 -
Cut the Sequence POJ - 3017 单调队列&&优化
单调队列优化dpegdp[i]dp[i]dp[i]: 表示前 iii个位置的划分,且每段总和≤m\le m≤m 的最小sum转移dp[i]=min(dp[j],max(a[j+1],a[j+2],...,a[i]))dp[i] = min(dp[j], max(a[j+1],a[j+2],...,a[i]))dp[i]=min(dp[j],max(a[j+1],a[j+2],...,a[i]))优化1(解决maxmaxmax部分):维护所有能选择的k∈[j+1,i]k\in[j+1,i]k∈[j+原创 2021-05-23 22:48:12 · 121 阅读 · 0 评论 -
edu109代码
dp做法#include <iostream>#include <cstdio>#include <vector>#include <map>#include <unordered_map>#include <set>#include <algorithm>#include <queue>#include <string>#include <cmath>#includ原创 2021-05-16 23:05:24 · 112 阅读 · 0 评论 -
AtCoder abc194_f Digits Paradise in Hexadecimal(数位dp + 状压)
题目地址题意:给你一个16进制数n,要求你[1,n][1,n][1,n] 中出现k个不同digits的数。思路:数位dp题目的n很大,所以要先压缩状态。学习:这里介绍(统计一个数在二进制下有多少个1)_builtin_popcount()学习地址AC#include <iostream>#include <bits/stdc++.h>#define For(i,x,y) for(int i = (x); i <= (y); i ++ )#de原创 2021-03-11 18:04:41 · 158 阅读 · 0 评论 -
Q - Little Girl and Maximum Sum CodeForces - 276C
AC(暴力瞎搞)/*皮卡丘冲鸭!へ /| /\7 ∠_/ / │ / / │ Z _,< / /`ヽ │ ヽ / 〉 Y ` / / イ● 、 ● ⊂⊃〈 / () へ | \〈 >ー 、_ ィ │ // / へ / ノ<| \\ ヽ_ノ (_/ │// 7 |/ >―r ̄ ̄`ー―_*/#include <iostream>#include <bit原创 2021-03-01 22:34:01 · 142 阅读 · 0 评论 -
Tickets HDU - 1260(简单线性dp+模拟)
Tickets HDU - 1260题意:有n个人要买票,卖票时,可以给一个人卖,也可以同时给相邻的两个人卖。每个人的时间为s[i]s[i]s[i]每个相邻组合的时间d[i]d[i]d[i]求:最少的时间。学习:c++结构体赋值,相比于其他面向对象语言的区别。在一个结构体内调用其他构造函数c++初始化,还有一个初始化列表思路:本题先不看输出:当前状态dp[i]=min(dp[i−1]+s[i],dp[i−2]+d[i])dp[i] = min(dp[i-1]+s[i], dp原创 2021-02-18 17:18:40 · 175 阅读 · 0 评论 -
Piggy-Bank HDU - 1114(完全背包)
Piggy-Bank HDU - 1114 题意:给你一个背包的体积,不过这个背包有初始容量。问:n种硬币,恰好使背包装满的最小价值。思路:由于题目说的是最小,所以一开始其他状态都置为+inf+inf+inf(正无穷)题目要求恰好,所以当转移到最后的dp【m】=infdp【m】= infdp【m】=inf时,说明无法装满。AC/*皮卡丘冲鸭!へ /| /\7 ∠_/ / │ / / │ Z _,< / /`ヽ │ ヽ / 〉 Y原创 2021-02-18 15:49:19 · 115 阅读 · 0 评论 -
Doing Homework HDU - 1074 (状压dp)
Doing Homework HDU - 1074 题意:有n个作业,每个作业有一个完成时间ccc,截至日期ddd。超时完成的任务,超过一分钟要扣1分。要求:现在要你给出一个完成作业的顺序使得扣分最少,假如有多种顺序都可以使得答案最小,那么就输出字典序最小的答案。思路:由于n只有15,所以考虑状压dp。AC(字典序最小,那么反过来dp一遍即可)/*皮卡丘冲鸭!へ /| /\7 ∠_/ / │ / / │ Z _,< / /`ヽ │ ヽ /原创 2021-02-17 22:09:10 · 125 阅读 · 0 评论 -
Max Sum Plus Plus HDU - 1024(线性dp,最大子段和的变种)
1. Max Sum Plus Plus HDU - 1024题意:线性dp,最大子段和的变种。给你一个数组,求最多分m个组的最大子段和。思路:开两维数组,一维记录前一个位置,算上a[i−1]a[i-1]a[i−1]的最大值。另外一维记录i−1i-1i−1的前缀中j−1j-1j−1组的最大值。转移时,每次加上当前位置a【i】当前位置a【i】当前位置a【i】反思:(读者自行跳过)一开始思路中的2想歪了,没有维护最大值,直接把后面的AC1( 开两维数组)/*皮卡丘冲鸭!へ原创 2021-02-14 16:38:03 · 132 阅读 · 0 评论 -
E. Tree Shuffling(树上dp2000)
E. Tree Shuffling题意:给你一棵有根树。根为1.每个结点都有一个值b[i]b[i]b[i] = 0/1。有一个目标值 c[i]c[i]c[i] = 0/1现在提供操作:你可以选择一个uuu结点作为根,在这棵子树下,同时修改k个结点,使得它们的值变为你想要的。花费为a[u]a[u]a[u]求:最小的花费思路:首先可以知道,无解的情况就是 0->1 的 个数 和 1->0 的个数不相等首先可以知道对于一个结点iii ,假如结点 ppp (u的爸爸) 花费更原创 2021-02-02 17:21:21 · 125 阅读 · 0 评论 -
2021牛客寒假算法基础集训营1 串(dp,主要是转移麻烦)
串题意:AC# include <bits/stdc++.h>using namespace std;const int N = 1e6+10;typedef long long ll;const ll mod = 1e9+7;ll dp[N][3];int main(){ int n; cin>>n; dp[0][0] = 1; ll ans = 0; for(int i = 1; i <= n; i ++){原创 2021-02-01 18:36:48 · 112 阅读 · 0 评论 -
D. Yet Another Yet Another Task(简单dp)
D. Yet Another Yet Another Task题意:给你n个数,其实要你求最大子段和。但是该题目有一个限制:每一段的和要减去 这一段里面最大的元素。思路:由于题目的a【i】只有30.所以考虑暴力dp。当前位置 iiia[i]>xa[i] > xa[i]>x, 那么可把 a[i]a[i]a[i]作为最大值,去转移。(即转移时不加上a【i】)反之,利用前面的最大值来转移。(转移时要加上a【i】)AC# include <bits/stdc++.h原创 2021-01-31 18:00:27 · 208 阅读 · 0 评论 -
有时间再补,先贴三个代码,还是tcl。。。。AtCoder Beginner Contest 190 E - Magical Ornament(最短路&&状压dp)
E - Magical Ornament题意:给你m条边。给你k个点,这k个点要都走到,且最后根据m条边形成一个最短的串。思路:应该是按照每k个点求最长路。之后dp(状压)。AC1#include<iostream>#include<algorithm>#include<vector>#include<queue>using namespace std;int N,M;vector<int>G[1<<17]原创 2021-01-31 00:07:08 · 237 阅读 · 0 评论 -
AcWing 126. 最大的和(最大子矩阵和)
题意:给你一个矩阵,要你找到最大子矩阵的和。思路:二维最大子段和。可以先枚举两条线(定上下),之后再操作最大子段和。(这里可以预处理出每一列的前缀和)。AC# include <bits/stdc++.h>using namespace std;const int N = 200;int g[N][N];int main(){ ios::sync_with_stdio(0); int n; cin>>n; for(int i = 1原创 2021-01-30 19:52:48 · 261 阅读 · 0 评论 -
AcWing 1371. 货币系统 (背包模型&&统计方案)
AcWing 1371. 货币系统题意:思路:背包模型的变式。AC# include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e4+10;ll f[N];const ll inf = 0x3f3f3f3f3f3f3f3f;int main(){ int n, m; cin>>n>>m; //memset(f,-1, size原创 2021-01-28 16:19:45 · 2247 阅读 · 1 评论 -
寒假每日一题 898. 数字三角形(我爱喝水)
898. 数字三角形AC1# include <bits/stdc++.h>using namespace std;const int N = 510;const int INF = 1E9+10;int a[N], dp[N];int main(){ ios::sync_with_stdio(0); int n; cin>>n; for(int i = 0; i <= n; i ++ )dp[i] = -INF; d原创 2021-01-10 18:22:09 · 205 阅读 · 0 评论 -
紫薯第9章动态规划,从入门到入土, dp 它tnl(背包代码模板部分)
分析方法闫氏dp分析法#mermaid-svg-lTy9WldnZnX5Dnon .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-lTy9WldnZnX5Dnon .label text{fill:#333}#mermaid-svg-lTy9WldnZnX5Dnon .node rect,#mermaid-sv原创 2021-01-01 13:37:26 · 108 阅读 · 0 评论 -
Color Length UVA - 1625(dp滚动数组)WTNL
Color Length UVA - 1625 转载1(ac)#include <iostream>#include <bits/stdc++.h>#define For(i,x,y) for(int i=(x); i<=(y); i++)#define fori(i,x,y) for(int i=(x); i<(y); i++)#define rep(i,y,x) for(int i=(y); i>=(x); i--)#define mst(x,a)原创 2020-12-10 21:16:09 · 224 阅读 · 1 评论 -
Partitioning by Palindromes UVA - 11584(dp)最小回文划分(我爱喝水,天天健康)
Partitioning by Palindromes UVA - 11584题意:将一个串划分为最少的回文串。思路:dp【i】第i个位置的最小划分。转移方程dp【i】=min(dp【j-1】+1,s[j−>i]s[j->i]s[j−>i]是回文串)。对于上面的判断回文,可以打表预处理。AC#include <iostream>#include <bits/stdc++.h>#define For(i,x,y) for(int i=(x);原创 2020-12-09 13:13:47 · 130 阅读 · 0 评论 -
Lighting System Design UVA - 11400(dp)
Lighting System Design UVA - 11400 题意:有n个灯泡,每个灯泡有电压 V, 电源花费K,单价C,需要的数量L。现在可以进行的操作:把电压低的换成电压高的。求:最优方案。思路:先对灯泡按电压排序。现在对于每种灯泡,要么全换,要么全不换。定义dp【i】为到第i个灯泡时的最优决策。转移方程 dp【i】 = min(dp【j】+ (sum【i】-sum【j】)*c【i】+k【i】);AC#include <iostream>#includ原创 2020-12-09 13:09:40 · 112 阅读 · 0 评论 -
Jin Ge Jin Qu hao UVA - 12563(01背包修改一下)
Jin Ge Jin Qu hao UVA - 12563 题意:给你n首歌曲,已知时间t不会超过歌曲的长度。求:在保证时间不会超过t的前提下,唱最多曲目,且要一首《劲歌金曲》。且时间总长度尽可能长。思路:歌曲是连续唱的,所以为了连上,状态转移加一个条件即可。还要保证结束之前唱一首《劲歌金曲》。那么最后统计一下答案即可。AC#include <iostream>#include <bits/stdc++.h>#define For(i,x,y) for(in原创 2020-12-08 19:39:50 · 108 阅读 · 0 评论 -
Unidirectional TSP UVA - 116(多阶段决策+输出字典序最小的路径)
Unidirectional TSP UVA - 116 题意:给你m行n列的矩阵,从第一列出发,到最后一列。要求经过的整数和最小。输出路径上,每列的行号,多解时,输出字典序最小的。思路:dp【i】【j】,表示从iii和jjj出发的最小开销(这里因为要记录路径所以从起点出发)AC#include <iostream>#include <bits/stdc++.h>#define For(i,x,y) for(int i=(x); i<=(y); i++原创 2020-12-08 19:05:32 · 140 阅读 · 0 评论 -
Tour UVA - 1347(dp二个决策)
Tour UVA - 1347题意:给你n个点(按照x的递增序列给出),你的目标是从设计一条路线,从最左边的点出发,之后到达最右边的点,之后再返回。要求除了最左点和最右的点,每个点只经过一次。思路:用d(i,j)d(i,j)d(i,j)表示1~max(i,j)max(i,j)max(i,j)全部走过,且两个人的当前位置分别是iii和jjj,还需要走多长的距离。不难发现d(i,j)=d(j,i)d(i,j)=d(j,i)d(i,j)=d(j,i),因此从现在开始规定在状态中i>ji>j原创 2020-12-08 18:39:55 · 91 阅读 · 0 评论 -
A Spy in the Metro UVA - 1025(dp 三个决策)
A Spy in the Metro UVA - 1025题意:有一个间谍,要去n城。n个城市之间有铁路连接。第iii个城市和第i+1i+1i+1个城市之间的时间是tit_{i}ti有双向的火车,从左出发的有m1m_1m1个,从右出发的有m2m_2m2个。每个火车都有出发时间。现给你一个时间T,间谍要在T时间上在n城与人接应。现在要求缩小候车时间。思路:时间是单向流逝的,是一个天然的“序”,影响到决策的只有当前时间和所处的车站,所以可以用dp(i,j)表示时刻i,你在车站j(编号原创 2020-12-08 12:47:21 · 224 阅读 · 0 评论 -
The Tower of Babylon UVA - 437(DAG上dp+智慧暴力)
The Tower of Babylon UVA - 437题意:有n个立方体。现在要你叠罗汉。且下面的块要严格大于上面的块思路:首先可以想到的是,对立方体进行旋转,之后有三种型号(三条边分别做高,枚举情况)上面其实是拆点的步骤,把一个点拆成多个,因为本身有相等关系,所以肯定不能自己叠自己。之后就是跑DAG去求一个最长路的模板。反思:有一次体会到了next_permutation的强大。(这个使用时,要先排序)AC#include <iostream>#inclu原创 2020-12-08 00:13:58 · 154 阅读 · 0 评论 -
CF---683---Div2--- D. Catching Cheaters(lcs的变式)
D. Catching Cheaters题意:给你两个串AB,要求你求出CD之间的4*LCS - C - D。其中CD为AB的子串。思路:直接在lcs的状态转移上修改一下即可。lcs的模板For(i,0,n)For(j,0,m){ if(i)dp[i][j] = max(dp[i][j],dp[i-1][j]); if(j)dp[i][j] = max(dp[i][j],dp[i][j-1]); if(i && j &&原创 2020-11-16 18:53:40 · 161 阅读 · 0 评论 -
C. The Hard Work of Paparazzi(dp) Codeforces Global Round 11
C. The Hard Work of Paparazzi题意:给你n个点,在一个r x r 的平面里。起点是(1,1).每个点都有个发生时间。假如在发生时间时,正好在该点可以ans++。距离的计算是曼哈顿距离。思路:显然dp。但是直接写会tle。优化也很简单。因为 rrr 的规模小。观察可以知道:假如从(1,1)左走r步,右走r步。可以走到整个图的任意一个点。由此,转移时,可以将规模缩小到n(2r)n(2r)n(2r)AC#include <iostream>#i原创 2020-10-11 16:14:55 · 265 阅读 · 1 评论 -
Nikitosh 和异或 LibreOJ - 10051( 01Trie && dp)
Nikitosh 和异或 LibreOJ - 10051 题解:本题题意是找到两个不相交区间,使得他们的异或和最大。思路:本题就是强硬套 01Trie 树即可。先把区间预处理一下,处理一个异或前缀和一个异或后缀。之后dp【i】。表示 iii 以前的最大异或和。(这里因为每次查看时,都是把一个前缀加入)所以可以利用trie,查找一个区间的最大异或值。转换为了求两个数的异或值,就是常规操作了。两个数的最大异或和,传送门最后再,反着来一遍即可。反思:本题要求你求两个区间的异或和。原创 2020-10-05 23:47:40 · 174 阅读 · 0 评论 -
UVA - 1401-------trie&&dp
Remember the Word UVA - 1401(传送门)题意:给你一个字典。和一个模式串。现在要求你按照字典分割模式串。求:方案数。思路:很容易想到递推的思想。一般思路:先原创 2020-10-01 14:45:41 · 123 阅读 · 0 评论 -
AtCoder Beginner Contest 178 D简单dp
D - Redistribution题意:给你一个和。要求你构造数组。这个数组的元素都是大于3.问:对于一个确定的s。有几种构造。思路:很容易就想到dp,之后根据样例编即可。(和数的分解差不多)AC#include <iostream>using namespace std;typedef long long ll;const ll mod=1e9+7;ll dp[2500];void init(){ for(int i=3; i<=2000; i++){原创 2020-09-14 00:44:24 · 157 阅读 · 0 评论