CF-477C(Dreamoon and Strings) DP
生活随笔
收集整理的這篇文章主要介紹了
CF-477C(Dreamoon and Strings) DP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CF-477C(Dreamoon and Strings)
題目鏈接
題意
兩個串S,TS,TS,T,問SSS中刪除[1,∣S∣][1,|S|][1,∣S∣]個字符之后,最多有多少個不重疊的T串
思路
dpdpdp
dp[i][j]dp[i][j]dp[i][j]: 位置iii前刪除jjj個字符之后的最大值
deldeldel: 表示位置iii前至少刪除多少個字符出現串TTT
dp[i][j]=max(dp[i?1][j],dp[i?∣T∣?del]+1)dp[i][j] = max(dp[i-1][j], dp[i-|T|-del]+1)dp[i][j]=max(dp[i?1][j],dp[i?∣T∣?del]+1)
#include <bits/stdc++.h> using namespace std; const int maxn = 2e3 + 5; const int inf = 0x3f3f3f3f; char s[maxn], t[maxn]; int lens, lent; int dp[maxn][maxn]; int calc(int x) {if (x < lent) return inf;int len = lent, cnt = 0;while (len && x) {if (s[x] == t[len]) x--, len--;else cnt++, x--;}if (len == 0) return cnt;else return inf; } int main() {scanf("%s%s", s+1, t+1);lens = strlen(s+1);lent = strlen(t+1);for (int i = 1; i <= lens; ++i) {int del = calc(i);for (int j = 0; j <= i; ++j) {dp[i][j] = max(dp[i][j], dp[i-1][j]);if (i-lent-del < j-del || j-del < 0) continue;if(j-del >= 0) dp[i][j] = max(dp[i][j], dp[i-lent-del][j-del]+1);}}for (int i = 0; i <= lens; ++i) printf("%d ", dp[lens][i]);return 0; }總結
以上是生活随笔為你收集整理的CF-477C(Dreamoon and Strings) DP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF-525E(E. Anya and
- 下一篇: CF-567F(President an