Codeforces Round #272 (Div. 2) E. Dreamoon and Strings 动态规划
2017-03-14 21:43
351 查看
题目链接:这里
题意:给你一个串S,和另外一个串P。把k从0到|S|枚举,然后问你去掉k个字符后,s串里面最多有多少个不重叠的p字符串
解法:还以为是什么kmp之类的。看了题解才知道可以dp做。dp[i][j]表示考虑到第i个位置,去掉了j个字符的最大值。然后我们对于每一个位置,先暴力找到最少去掉多少个,才能加一,然后暴力去转移这个玩意儿就好了。
题意:给你一个串S,和另外一个串P。把k从0到|S|枚举,然后问你去掉k个字符后,s串里面最多有多少个不重叠的p字符串
解法:还以为是什么kmp之类的。看了题解才知道可以dp做。dp[i][j]表示考虑到第i个位置,去掉了j个字符的最大值。然后我们对于每一个位置,先暴力找到最少去掉多少个,才能加一,然后暴力去转移这个玩意儿就好了。
//CF 476E #include <bits/stdc++.h> using namespace std; const int maxn = 2005; const int limit = 2005; char s1[maxn], s2[maxn]; int dp[maxn][maxn], len1, len2;//dp[i][j]代表考虑到i位置,去掉了j个字符的最大值 int match(int x){ if(x < len2) return limit; int a = x, b = len2, tmp = 0; while(a && b){ if(s1[a] == s2[b]) a--, b--; else tmp++, a--; } if(b == 0) return tmp; else return limit; } int main(){ scanf("%s%s", s1+1, s2+1); len1 = strlen(s1+1); len2 = strlen(s2+1); memset(dp, 0, sizeof(dp)); for(int i = 0; i <= len1; i++) for(int j = 0; j <= len1; j++) if(i<j) dp[i][j] = -3000; for(int i = 1; i <= len1; i++){ int x = match(i); for(int k = 0; k <= len1; k++) dp[i][k] = max(dp[i][k], dp[i-1][k]); for(int k = 0; k <= len1; k++) if(k>=x) dp[i][k] = max(dp[i][k], dp[i-x-len2][k-x]+1); } for(int i = 0; i <= len1; i++) printf("%d ", dp[len1][i]); }
相关文章推荐
- Codeforces Round #272 (Div. 1) C. Dreamoon and Strings
- Codeforces Round #272 (Div. 2) C. Dreamoon and Sums (数学 思维)
- Codeforces Round #272 (Div. 2) B. Dreamoon and WiFi 暴力
- Codeforces Round #272 (Div. 2)-B. Dreamoon and WiFi
- 【Codeforces Round 272 (Div 2)B】【暴力dfs or 组合数】Dreamoon and WiFi 问号填加减方案数使得最后恰好增量为aim
- Codeforces Round #272 (Div. 2) D. Dreamoon and Sets (思维 数学 规律)
- Codeforces Round #272 (Div. 2) B Dreamoon and WiFi(简单DP)
- Codeforces Round #272 (Div. 2) C. Dreamoon and Sums 数学
- Codeforces Round #272 (Div. 2) C Dreamoon and Sums(数学)
- 【Codeforces Round 272 (Div 2)C】【暴力】Dreamoon and Sums 所有除b结果是模b结果[1,a]倍数字之和
- Codeforces Round #272 (Div. 2) D Dreamoon and Sets(构造)
- Codeforces Round #272 (Div. 2) B. Dreamoon and WiFi (超几何分布)
- 【Codeforces Round 272 (Div 2)A】【贪心 暴力 水题】Dreamoon and Stairs n个台阶每次走一步或两步是否有步数恰好为m倍数
- Codeforces Round #272 (Div. 1) A. Dreamoon and Sums(数论)
- codeforces Round #272(div2) D解题报告
- Codeforces Round #363 (Div. 2) C. Vacations(DP 动态规划)
- Codeforces Round #272 (Div. 2) 题解
- B. Dreamoon and WiFi(Codeforces Round 272)
- Codeforces Round #FF (Div. 1) A. DZY Loves Sequences 动态规划
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划