团体程序设计天梯赛 L3-020 至多删三个字符 (30分)(DP)
题目链接:
L3-020 至多删三个字符 (30分)
思路:
PAT顶级有一道类似的,至多删两个字符最多能得到多少不同字符串,题解就请参考这篇啦:
https://blog.csdn.net/qq_45228537/article/details/103033486
重点就是去重过程;
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
string s;
int n;
ll ans,dp[maxn][4] = {1, 1, 0 ,0};
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
cin >> s;
n = s.length();
for(int i = 1; i < n; i++) {
dp[i][0] = 1;
for(int j = 1; j <= 3; j++) {
if(j > i + 1) break;
if(j == i + 1) { dp[i][j] = 1; break; }
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
for(int p = i - 1; p >= 0 && i - p <= j; p--)
if(s[p] == s[i]) {
dp[i][j] -= p ? dp[p - 1][j - i + p] : 1;
break;
}
}
}
for(ll & x : dp[n - 1]) ans += x;
cout << ans;
return 0;
}