至多删三个字符(DP)
思路就是首先重复计算是什么情况
比如aca 当删除两个时 都能得到 a
很显然 只有当当前字符与前一个同样字符的距离小于等于要删除的字符数量时 才会出现重复计算
namo 当发生重复时 i 和 lst[s[i]] 之间一定删除了 i - lst[s[i]]
个字符
那么lst[s[i]]前面的就删除了j-(i-lst[s[i]])
个字符
很显然这部分是重复计算了两遍 所以减掉一次即可
本题会爆int
((建议#define int long long
map<char, int> lst;
dp[0][0] = 1;
for(int i = 1; i <= n; i ++) {
dp[i][0] = 1;
for(int j = 1; j <= min(3, i); j ++) {
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
if(lst[s[i]] and (i - lst[s[i]]) <= j) {
dp[i][j] -= dp[lst[s[i]] - 1][j - (i - lst[s[i]])];
}
}
lst[s[i]] = i;
}