DP
蓝丶星灬
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
F-Nearest Beautiful Number [ Codeforces Round #739 (Div. 3) ] 仿数位DP 状压
链接:https://codeforces.com/contest/1560/problem/F1题意:要求用0-9中选k个数作为目标数的某一位(可以重复用)输出大于等于给出数的最小值题解:不是数位DP,但是很像从前往后查找,对于某位置升序查找判断一下取的数是否满足条件(状压DP思想)这样确保找到的数一定是最小的#include<bits/stdc++.h>using namespace std;string s;int ans;int k;int check(int原创 2021-08-19 19:52:46 · 142 阅读 · 0 评论 -
P4052-文本生成器 AC自动机 DP
链接:https://www.luogu.com.cn/problem/P4052题解:对于这个题,我们可以先将AC自动机建立出来,然后搞一个简单的容斥用所有的情况减去不可读的情况。那么那些是不可读的情况呢?当然就是跑不到单词结尾节点的情况喽……定义f[i][j]表示当前在j点且串长为i时不经过单词结尾的路径条数然后从父亲往儿子转移即可实验室某refun大佬说AC自动机的DP都非常套路大部分f[i][j]表示当前在节点j,且串长为i时的情况,有时再加一维表示这个状态里面包含了哪些东西而且转载 2021-08-05 17:02:59 · 169 阅读 · 0 评论 -
P6239-奇怪的道路 状压DP
链接:https://www.luogu.com.cn/problem/P6239题意:n 座城市,编号为 1-n。m 条道路连接在这些城市之间,一对城市之间可能存在多条道路。对于任何一条道路,设它连接的两个城市分别为 u和 v,则必定满足 1≤∣u−v∣≤k。任何一个城市都与恰好偶数条道路相连( 0 也被认为是偶数)。两种可能的连接方法不同当且仅当存在一对城市,它们间的道路数在两种方法中不同。有可能存在两个城市无法互相到达。输出道路连接方法数模1e9+7 后的结果。题解:dp时到i点,只原创 2021-08-16 16:56:48 · 158 阅读 · 0 评论 -
E-Mocha and Stars [ Codeforces Round #738 (Div. 2) ] DP 容斥
链接:https://codeforces.com/contest/1559/problem/E#include<bits/stdc++.h>using namespace std ;typedef long long ll;const int maxn=1e5+10;const ll mod=998244353;int l[maxn];int r[maxn];ll dp[60][maxn];ll cnt[maxn];ll sum[maxn];int main(){原创 2021-08-16 11:06:21 · 490 阅读 · 1 评论 -
P3177-树上染色 树形DP
链接:https://www.luogu.com.cn/problem/P3177题意:给您一棵有 n 个点的树,树上的边有边权,让你在其中选择出k个黑点,其余的为白点,使得黑点与黑点的距离总和与白点和白点的距离总和的和最大, 让您求出这个值最大是多少。思路:我们在考虑多种状态后选出一种容易转移且可以保证正确性的状态,我选择的是 f[x][ j ] 表示以 x 的子树中选择 j 个黑点对于答案的最大贡献,那么,这个问题就转换成了一个树上的背包问题,即对于节点 x 每一个子节点 y 的子树 ,都可以选原创 2021-08-10 20:23:35 · 323 阅读 · 0 评论 -
D-Double Strings
链接:https://ac.nowcoder.com/acm/contest/11256/D题解:好的方案的构成是“一段相同的前缀+一个不同字符(a比b小)+长度相同的任意后缀”。枚举不同的字符在两个序列中的位置。用dp[i][j]表示只考虑 A 中的前 i 个字符和 B 中的前 j 个字符时的相同的子序列的个数,转移可以 O(1),这样可以统计出相同的前缀个数,这部分是 O(|s|*|t|) 的。长度相同的任意后缀也可以用类似的 dp 计算,或者设 A 中此时剩余长度为 x, B 中剩余长度为 y原创 2021-08-01 23:19:17 · 343 阅读 · 0 评论 -
C-Hasan and his lazy students
https://codeforces.com/gym/326786/problem/C题意:给出一个序列,求最长上升子序列长度及个数。解法:dp[ i ] 其中i为数的下标,其中存最长子序列的长度cnt[ i ][ j ] 其中i为数的下标,j为序列长度,其中存到i的长度为j的上升序列个数那么依次枚举每位数,记当前枚举的数为 i ,它前面的某一个数为 j ,则如果第 i 位数大于第 j 位数,则到第 j 位数构成的上升子序列可以接到第 i 位数前面。有状态转移方程:dp[ i ]=max(d原创 2021-05-03 17:51:48 · 122 阅读 · 0 评论 -
G-The Galactic Olympics
https://codeforces.com/gym/326694/problem/G假设要把n+1个元素分成m个集合则分析如下:1.如果n个元素构成了m-1个集合,那么第n+1个元素单独构成一个集合。方案数m×S(n,m-1)。2.如果n个元素已经构成了m个集合,将第n+1个元素插入到任意一个集合。方案数 m×S(n,m) 。注意有特殊情况:1.如果只有一个集合,那方案数只有一种。2.如果元素个数n等于集合数,那么它是一个n的全排列,如果要再加一个单个元素的新集合,应该乘n+1。#inc原创 2021-05-02 21:23:29 · 189 阅读 · 0 评论 -
E-Optimal Slots
https://codeforces.com/gym/324833/problem/E#include<bits/stdc++.h>using namespace std;int t,n;int c[100005];int dp[100005];int path[10005][105];void solve(){ for(int i=n;i>=1;i--){ //这种方法输出顺序与dp顺序必定相反 //必须是倒着扫 //原创 2021-04-26 16:56:55 · 149 阅读 · 0 评论
分享