DP
行走天涯的豆沙包
人生天地间,忽如远行客。
展开
-
期望DP——珂学送分
题解:dp[i]dp[i]dp[i]代表[i…n]这个区间分成多少段的期望值我们从后面往前面扫描,当我们发现i−ji-ji−j这个范围是满足的话,那么我们可以切分的点就存在j−i+1j-i+1j−i+1个点。假设我们选择点k,k属于[i,j][i,j][i,j]这个区间,那么我们这段的期望就是1/len1/len1/len乘以(dp[k+1]+1),k属于[i,j][i,j][i,j]。#include<bits/stdc++.h>//#define int long longusin原创 2020-10-27 00:20:09 · 177 阅读 · 0 评论 -
数位dp——Great Deceiver
题解:下标为奇数位置上的数的系数必须要为0剩下的就是数位dp了。#include <bits/stdc++.h>#define int long longusing namespace std;const int N=100;int n,m,k;int a[N],f[N];int dfs(int idx,int limit){ if(idx==0) return 1; if(!limit&&f[idx]!=-1) return f[idx];原创 2020-10-06 12:30:54 · 1849 阅读 · 0 评论 -
概率dp——跑路ing
题解:既然等概率又收敛,多跑一百次就是答案了。#include <bits/stdc++.h>using namespace std;int n,m,k;const int N=100+10;double f[N][N];vector<int> g[N];void solve() { int n,m; while(~scanf("%d%d",&n,&m)) { for (int i = 1; i <= n; i++原创 2020-10-05 21:43:06 · 184 阅读 · 0 评论 -
期望DP——配对游戏
题解:f(i,j)f(i,j)f(i,j)定义为前i个人,被抵消掉过后还剩j个人向右看。求出来过后的期望乘以2就行了。#include <bits/stdc++.h>using namespace std;int n,m,k;const int N=1e5+10;int dp[2010][2010];void solve(){ memset(dp,0,sizeof(dp)); int n; scanf("%d", &n); dp[0][0]原创 2020-10-05 18:30:33 · 164 阅读 · 0 评论 -
期望DP——景区路线规划
题解:分开算男女的期望,因为是等概率出现各个景点,并且是等概率选择分支景点,所以记忆化搜索满意度和再除以n就行了。#include <bits/stdc++.h>using namespace std;int n,m,k;const int N=1e5+10;int ci[N],h[N][3];double f[105][500][3];typedef pair<int,int> pp;vector<pp> g[N];double dfs(int u,原创 2020-10-05 14:47:14 · 232 阅读 · 0 评论 -
概率DP——比赛
题解:我们知道一个题做不出的概率,用1减去就是能做的概率,然后直接概率dp就行了。f(i,j)f(i,j)f(i,j)代表前i个题能做出j个题的概率。#include <bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10;double a[N],b[N],c[N],d[N];double f[100][100];void solve(){ for(int i=1;i<原创 2020-10-03 13:30:21 · 141 阅读 · 0 评论 -
C. Square Subsets
题解:题目让找几个数的乘积是一个完全平方数,我们知道完全平方数的质因数分解之后的因子的指数都是偶数,70以内的素数只有10多个,所以选择用状压dp。我们状压的状态就是这些素数因子的指数是否为偶数。选择一个数的时候相当于把这个数的连续质因子指数加到另一个质因子的指数上面,当我们这个质因子的指数为偶数的时候那么加上偶数不影响当前的奇偶性,直接由上一个状态转移过来就行了。为奇数的时候就转移到亦或为0的状态。根据二项式定理我们知道,k个数里选1,3,5。。这样的奇数个的方案为2k−12^{k-1}2k−1,偶数的原创 2020-09-18 19:56:10 · 124 阅读 · 0 评论 -
E. Cashback
题解:做过一道相似的题,方法也差不多,就是分块的时候要么把块分成长度为1,要么分成长度为m,这样就是最优的,当分成1的时候我们就不用去除最小块了,当分成长度为m的时候我们就用st表查询区间最小值然后删掉。#include <bits/stdc++.h>using namespace std;#define int long longtypedef long long ll;const int N = 1e5+10;int f[N],pre[N],a[N],n,m;int st[N原创 2020-09-07 16:49:30 · 129 阅读 · 0 评论 -
单调队列优化DP——围栏
传送门题解:这道题只有两种状态,一个是工人,一个是砖,那么我们就可以定义我们的函数f[i][j]f[i][j]f[i][j]代表的是到第i个工人刷到j块砖所花费的代价。定义完状态过后我们开始划分集合,第一种就是第i个工人不刷那么就是f[i−1][j]f[i-1][j]f[i−1][j],然后就是第i个工人刷,刷的话又分不刷第j块砖,就是f[i][j−1]f[i][j-1]f[i][j−1],然后就是刷第j块砖,因为这道题是连续刷,那么也就是刷到第j块砖。我们可以从[1,j]…[j,j]这样的区间来刷砖原创 2020-07-17 23:45:25 · 101 阅读 · 0 评论 -
最大子段和——Maximum Sum on Even Positions
题解:首先我们知道如果反转奇数的长度的话那么翻转的序列是没有变化的。所以我们只能反转奇数长度的数组。然后我们模拟反转偶数长度的时候,可以发现其实交换的就是相邻数组的位置。所以我们每次交换得到的贡献有两种,一个是a[i]-a[i-1],另一种是a[i-1]-a[i];所以我们先将偶数下标的答案加起来,再枚举反转区间,也就是找最大连续子段和。#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;typedef原创 2020-07-17 16:36:59 · 845 阅读 · 0 评论 -
背包——Multiple Testcases
传送门题解:首先我们可以知道我们应该从质量较大的物品开始放,比如我们i=2的物品有3,c[2]=3,那么我们把i=2的放进去了过后我们1的物品一定是可以放至少1个。因为c[j]>=c[i] (j<i)。我们遍历背包,当我们一组物品中的大小值大于等于c[m[i]的时候我们就需要换一组背包来重新放了。#include<bits/stdc++.h>using namespace std;const int N=2e5+7;int m[N],c[N];int n,k;vect原创 2020-05-21 16:22:24 · 160 阅读 · 0 评论 -
树形DP——黑白树
传送门题解:我们把子节点的影响转移到父节点上来设计会简单很多。我们树形dp返回一个当前子树内的最大向上延伸距离,因为是传递的子节点的距离信息,所以到父节点的时候就是距离-1。所以一旦举例小于等于0,等于其子节点不能覆盖父亲节点所以答案需要加一。然后注意更新父节点的距离信息。#include <bits/stdc++.h>using namespace std;const in...原创 2020-05-06 22:16:32 · 192 阅读 · 0 评论 -
牛客算法周周练5
小雨坐地铁题解:采用分层图跑最短路。#include<bits/stdc++.h>using namespace std;#define mp make_pair#define ll long long#define INF 0x3f3f3f3fconst int N = 1e6+100;int n, m, s, t;int ne[N<<1],head[N...原创 2020-05-05 20:58:49 · 167 阅读 · 0 评论 -
排列组合|DP——树
传送门题解以DP的思路去理解的话就是,当一条dfs序上面的,子节点的父节点肯定已经涂过颜色了,而对于他的兄弟节点来说可能涂了也可能没有涂。所以对于当前结点的涂色就是涂和父节点一样的颜色或者不一样的颜色。那么状态转移方程式很容易就知道是f(i,j)=f(i−1,j)+f(i−1,j−1)∗(k−j+1)f(i,j)=f(i-1,j)+f(i-1,j-1)*(k-j+1)f(i,j)=f(i−1,j...原创 2020-05-05 17:18:18 · 431 阅读 · 0 评论 -
树形DP——Rinne Loves Edges
传送门题解:无向联通图就是树的形状,其次让我们以s为根使得所有的叶子节点不能到达根并且让删去边权的总和最小,那么就是典型的树形DP了。#include <bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;int n,m,s;const int N=2e5+7;int head[N],e[N],cnt,w...原创 2020-04-28 19:16:36 · 123 阅读 · 0 评论 -
状压DP——Playlist for Polycarp (easy version)
题目链接题解:我们看到n只有15并且让我们求 方案数的时候就可以考虑用dp了,并且是状压DP,这道题的状态方程是f(i,j)f(i,j)f(i,j)代表为i状态并且以j歌曲结尾的的方案数。所以我们只需要知道上一个状态并且使新状态加上他就可以完成更新了。这里的入口就是f(0,0)=1f(0,0)=1f(0,0)=1。#include <bits/stdc++.h>using na...原创 2020-04-05 12:28:37 · 134 阅读 · 0 评论 -
区间dp——最长回文子序列
题目描述输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可输入描述:第一行一个整数T(T ≤ 50)。接下来2T行,...原创 2020-03-31 16:59:27 · 199 阅读 · 0 评论 -
牛客OI周赛14-普及组 C&D
C:题解:找树的重心。#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e6+7;int ne[N],head[N],e[N],cnt,ind[N],sum[N],sz[N],depth,n;void add(int a,int b){ e[cnt]=b...原创 2020-03-09 19:40:42 · 154 阅读 · 0 评论 -
Beautiful Mirrors —— 期望DP
Beautiful Mirrors题解:f(i)f(i)f(i)表示到达第i个关卡所用的期望天数。f(i)=pi∗(fi−1+1)+(fi+fi−1+1)∗(1−pi)f(i)=p_i*(f_{i-1}+1)+(f_i+f_{i-1}+1)*(1-p_i)f(i)=pi∗(fi−1+1)+(fi+fi−1+1)∗(1−pi)然后根据下面化简得到递推式。#include <...原创 2020-03-06 19:20:41 · 229 阅读 · 0 评论 -
Portals—— DP
Portals题解:这道题首先我们知道是DP但是先要贪心出全集中的一小块区域来优化我们的DP(我们DP都是在一个大的集合方案上面找最优解决子集)。这道题我们肯定对于一个点驻扎的情况的时候我们肯定贪心选择距离这个点最远的地方来驻扎,因为这样过来的路上可以收尽量多的兵。还有就是我们需要确定我们的步骤顺序,我们需要先征兵,再驻扎。对于征兵来说我们肯定需要占领这个地方。一旦占领了肯定是要收兵的,兵当然...原创 2020-03-06 18:23:16 · 122 阅读 · 0 评论 -
Minimax Problem——状压+二分
Minimax Problem题解:最小值最大就可以往二分想了,然后看到m的数值非常的小,就可以用状压去暴力枚举。但是我们知道状压记录的01状态,这里可能有很多个不同的数怎么转化成01状态,因为二分所以我们可以把他归结于二分类问题,大于等于mid就是1,否则就是0。然后枚举过程中需要保证每个状态是存在的。并且从两列中选出来的一个新排列的个数需要保证有m个。#include <bits/...原创 2020-03-05 11:29:00 · 271 阅读 · 0 评论 -
Codeforces 1294F three paths on a tree
Codeforces 1294F three paths on a tree题解:树的直径的思想,但是这里是三个点,并非两个点,但是我们任然可以用树的直径的思想,首先肯定存在x,y两个端点他们之间的距离是图中任意两点间最远的。其次我们第三个点肯定是和x,y的距离和加起来在任意三点间距离和最大。然后我们定义p=lca(x,y,c)p=lca(x,y,c)p=lca(x,y,c)可以知道:de...原创 2020-03-04 20:04:10 · 125 阅读 · 0 评论 -
E2. String Coloring (hard version)
E2. String Coloring (hard version)题解:分析可以知道我们肯定是一个字典序大于了一个字母的字典序那么就交换,所以题目就转换成了找序列的有多少个不下降序列。根据Dilworth’s theorem:我们知道:不下降子序列的个数=最长不上升序列的长度。不上升子序列的个数=最长不下降序列的长度。所以我们这道题就是查找最长不上升序列的长度。我们定义dp1[i...原创 2020-03-04 18:56:48 · 201 阅读 · 0 评论 -
codefroces——Rectangle Painting 1
Rectangle Painting 1题解如图所示:f(x1,y1,x2,y2)f(x1,y1,x2,y2)f(x1,y1,x2,y2)表示x1,y1为左上角,x2,y2为右下角为矩形的最小花费。#include <bits/stdc++.h>using namespace std;char ma[55][55];int f[55][55][55][55];int s...原创 2020-03-03 20:56:46 · 113 阅读 · 0 评论 -
Josephina and RPG——概率DP
Josephina and RPGProblem DescriptionA role-playing game (RPG and sometimes roleplaying game) is a game in which players assume the roles of characters in a fictional setting. Players take responsibi...原创 2020-02-22 16:05:59 · 143 阅读 · 0 评论 -
01背包+打印路径——Optimal Slots
E - Optimal SlotsThe main hall of your residency is open for use by the local community and public. Since it was built on public donations, there is no charge of using it. Every weekend particularly ...原创 2020-02-12 16:35:46 · 313 阅读 · 0 评论 -
状压DP—— Military Class
F - Military ClassThere is a military class of 2∗n soldiers, and the commander wants all of them to get partnered into n pairs. He divides the soldiers into two lines of length n, and numbers the sol...原创 2020-02-12 16:14:27 · 437 阅读 · 0 评论 -
DP+矩阵快速幂+kmp——GT考试
GT考试阿申准备报名参加 GT 考试,准考证号为 n 位数 X1X2⋯XnX_1X_2⋯X_nX1X2⋯Xn,他不希望准考证号上出现不吉利的数字。他的不吉利数字 A1A2⋯AmA_1A_2⋯A_mA1A2⋯Am 有 m 位,不出现是指 X1X2⋯Xn 中没有恰好一段等于 A1A2⋯AmA_1A_2⋯A_mA1A2⋯Am,A1A_1A1 和 X1X_1X1 可以为 0。输...原创 2020-02-11 22:38:09 · 204 阅读 · 2 评论 -
AC自动机+dp——单词
单词某人读论文,一篇论文是由许多单词组成的。但他发现一个单词会在论文中出现很多次,现在他想知道每个单词分别在论文中出现多少次。输入格式第一行一个整数 N,表示有多少个单词。接下来 N 行每行一个单词,单词中只包含小写字母。输出格式输出 N 个整数,每个整数占一行,第 i 行的数字表示第 i 个单词在文章中出现了多少次。数据范围1≤N≤2001≤N≤2001≤N≤200,所有单词...原创 2020-02-08 22:18:37 · 218 阅读 · 0 评论 -
AC自动机+状态机dp——修复DNA
修复DNA生物学家终于发明了修复DNA的技术,能够将包含各种遗传疾病的DNA片段进行修复。为了简单起见,DNA看作是一个由’A’, ‘G’ , ‘C’ , ‘T’构成的字符串。修复技术就是通过改变字符串中的一些字符,从而消除字符串中包含的致病片段。例如,我们可以通过改变两个字符,将DNA片段”AAGCAG”变为”AGGCAC”,从而使得DNA片段中不再包含致病片段”AAG”,”AGC”,”...原创 2020-02-08 19:44:15 · 582 阅读 · 0 评论 -
区间DP——Kattis - runningroutes
Kattis - runningroutesThe administrators at Polygonal School want to increase enrollment, but they are unsure if their gym can support having more students. Unlike a normal, boring, rectangular gym, ...原创 2020-02-07 22:43:31 · 214 阅读 · 0 评论 -
期望DP——Kattis - researchproductivityindex
Kattis - researchproductivityindex题意:一个作者发论文,每个论文的成功率对应一个指数,现在有n篇论文,每个论文发表的成功率给出,问最大期望值。题解:概率的转移方程是d[i][j]=d[i−1][j]∗(1−a[i])+d[i−1][j−1]∗a[i]d[i][j]=d[i-1][j]*(1-a[i])+d[i-1][j-1]*a[i]d[i][j]=d[i...原创 2020-02-06 23:52:48 · 156 阅读 · 0 评论 -
并查集+01背包——搭配购买
搭配购买Joe觉得云朵很美,决定去山上的商店买一些云朵。商店里有 n 朵云,云朵被编号为 1,2,…,n,并且每朵云都有一个价值。但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配的云都要买。但是Joe的钱有限,所以他希望买的价值越多越好。输入格式第 1 行包含三个整数 n,m,w,表示有 n 朵云,m 个搭配,Joe有 w 的钱。第 2∼n+1行,每行两个整数...原创 2020-02-03 21:27:37 · 346 阅读 · 1 评论 -
状压/枚举子集DP——筱玛爱阅读
筱玛爱阅读才学了枚举子集DP留坑,快打cf了,打完就来写。(逃)原创 2020-01-29 21:55:55 · 180 阅读 · 0 评论 -
状压DP——郊区春游
郊区春游题解:TSP问题。先把几个去的郊区的两两最短距离算出来,然后就是状压DP的过程了。#include <bits/stdc++.h>using namespace std;const int MAXN = 210,MAXR = 16;int n, m, R, dst[MAXR];int dis[MAXN][MAXN];int f[1 << MAXR][...原创 2020-01-29 20:00:54 · 149 阅读 · 0 评论 -
单调队列优化DP+二分——绿色通道
绿色通道高二数学《绿色通道》总共有 n 道题目要抄,编号 1,2,…,n,抄第 i 题要花 ai 分钟。小 Y 决定只用不超过 t 分钟抄这个,因此必然有空着的题。每道题要么不写,要么抄完,不能写一半。下标连续的一些空题称为一个空题段,它的长度就是所包含的题目数。这样应付自然会引起马老师的愤怒,最长的空题段越长,马老师越生气。现在,小 Y 想知道他在这 t 分钟内写哪些题,才能够尽量减...原创 2020-01-17 11:33:26 · 310 阅读 · 0 评论 -
单调队列优化DP——烽火传递
烽火传递烽火台是重要的军事防御设施,一般建在交通要道或险要处。一旦有军情发生,则白天用浓烟,晚上有火光传递军情。在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确传递,在连续 m 个烽火台中至少要有一个发出信号。现在输入 n,m 和每个烽火台的代价,请计算在两城市之间准确传递情报所需花费的总代价最少为多少。输入格式第一行是两个整数 n,m,具体含义见题...原创 2020-01-17 10:49:43 · 232 阅读 · 0 评论 -
单调队列优化DP——旅行问题
旅行问题John 打算驾驶一辆汽车周游一个环形公路。公路上总共有 n 个车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。任务:判断以每个车站为起点能...原创 2020-01-16 23:16:45 · 401 阅读 · 2 评论 -
单调队列优化DP——修建草坪
修建草坪在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠。然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作。FJ 有 NN 只排成一排的奶牛,编号为 11 到 NN。每只奶牛的效率是不同的,奶牛 ii 的效率为 EiEi。编号相邻的奶牛们很熟悉,如果 FJ 安排超过 KK 只编号连续...原创 2020-01-14 21:02:31 · 185 阅读 · 0 评论 -
单调队列优化DP——最大子序列和
前言:单调队列可以优化什么呢?我们发现单调队列是处理滑动窗口中的最值问题的。(一个固定长度的滑动窗口)。输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大。注意: 子序列的长度至少是1。输入格式第一行输入两个整数n,m。第二行输入n个数,代表长度为n的整数序列。同一行数之间用空格隔开。输出格式输出一个整数,代表该序列的最大子序和。数据范...原创 2020-01-14 10:59:54 · 349 阅读 · 0 评论