Codeforces 1183H DP 计算子序列数目】的更多相关文章

题意及思路:https://blog.csdn.net/mmk27_word/article/details/93999633 第一次见这种DP,有点像退背包的思想,如果发现有可能因为字母相同和前面算重时,把这种情况减去. 代码: #include <bits/stdc++.h> #define LL long long using namespace std; const int maxn = 110; int pre[30]; LL dp[maxn][maxn]; char s[maxn]…
题意:给你一个长度为n的字符串,定义两个字符串的相关度为两个串对应的子串中第一个串字典序大于第二个串的个数.现在给你相关度,和第二个串,问满足条件的第一个串有多少个? 思路:设dp[i][j]为填了前i个字符,后面的字符和s相同,相关度为j的方案数.现在有两种转移: 1:i位置填的字符大于s[i], 那么我们假设i前面第一个与s不相等的位置是l(即s[l + 1]到s[i]是相等的), 那么相当于左端点在[l + 1, i], 右端点在[i, n]的区间都会产生贡x献,那么从dp[l][j -…
codeforces 1183H 动态规划 传送门:https://codeforces.com/contest/1183/problem/H 题意: 给你一串长度为n的字符串,你需要寻找出他的最长的前k个子串,问你得到这些子串需要减少的字符个数之和是多少,easy版本的k是100,hard版本的k是1e12. 题解: hard版本题解: dp[i][j]表示前i个字符中选择了j个的子串数目 如果前面有出现过的字符呢?比如 aba 算到第二个a的时候 把ab 删掉 和 把 ba删掉 得到同一种结…
题意:有一张白纸条,你需要给这张纸条染色.染色从颜色1开始染色,每次选择纸条的一段染色时,这一段的颜色必须是相同的.现在给你染色后的纸条,问有多少种染色方案? F1: 思路:最开始的想法是以染色顺序为一个维度,然后染色区间为另外两个维度去DP,但是最后发现不可以,因为之前的所有的染色对后面的影响不确定,只用在染第几种颜色是无法确定现在可以染色的区间的,还无法记忆化,只能去看题解...官方题解的DP设计的比较巧妙.我们DP并不关心染色顺序,我们的关注点在区间.我们可以发现,对于一个区间,第一次开始…
题目链接: http://codeforces.com/contest/1183/problem/H 题意: 给出一个长度为$n$的字符串,得到$k$个子串,子串$s$的花费是$n-|s|$ 计算最小花费 数据范围: $1 \le n \le 100, 1 \le k \le 10^{12}$ 分析: dp依然还是那么神奇 定义$dp[i][j]$为考虑前$i$个字符,删除$j$个字符的方案数 首先$dp[i][j]=dp[i-1][j]+dp[i-1][j-1]$ 前者为不保留第$i$个字符,…
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #define TS printf("!!!\n") #define pb push_back #define inf 0x3f3f3f3f //std::ios::sync_with_stdio(false); using namespace std; //priority_queue<i…
题目:https://vjudge.net/contest/325352#problem/C 题意:输入n,m,给你一个长度为n的串,然后你有一个集合,集合里面都是你的子序列,集合里面不能重复,集合中元素的花费是 n-当前元素长度 ,也就是删除了几个字符,然后要你求前m个最小花费是多少 思路:我们考虑dp,dp[i][j] 前i个字符删除j个字符的方案数,我们先假设没有重复字符,没有的话,很明显转移方程就是dp[i][j]=dp[i-1][j-1]+dp[i-1][j] 也就是考虑   当前字符…
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个序列求和的最大值是多少 分析:设dp[i][j]在[j,n]范围内取了i个子序列求和所得的最大值,用sum[i]表示[1,i]的求和.转移方程为dp[i][j]=max(dp[i-1][j+m]+sum[j+m-1]-sum[j-1],dp[i][j+1]),表示要不要选择[j,j+m-1]这段为其…
题意:给你一个长度为n的字符串,有q次询问,每次询问会给字符串x的末尾添加一个字符y,或者删除字符串x末尾的字符,询问过后,要判断长度为n的字符串中是否有3个不重合的子序列,是这3个字符串. 思路:设dp[i][j][j]为3个字符串的长度分别为i, j, k时,匹配的最靠前的位置.那么就枚举是通过哪个字符串转移即可,但是这样是O(n ^ 3)的.我们注意到每次询问过后某个字符串的长度最多改变1,那么我们可以只重新计算没改变的那两维就可以了. 代码: #include <bits/stdc++.…
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #include <iostream>#include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) using namespace std; , M = 1e7+; int n; int a[N], dp[N][N], x[M],…