#include <bits/stdc++.h>
#define N 1000100
using namespace std;
long long int dp[N][4],sum;
int main()
{
char s[N];
scanf("%s",s+1);
int m=strlen(s+1);
dp[0][0]=1;
for(int i=1; i<=m; i++)
{
for(int j=0; j<=3; j++)
{
if(j>i)
{
break;
}
dp[i][j]+=dp[i-1][j];//不删除第i个字符
if(j>=1)
{
//删除第i个字符
dp[i][j]+=dp[i-1][j-1];
}
for(int k=i-1; k>=1&&(j-i+k)>=0; k--)
{
if(s[k]==s[i])
{
dp[i][j]-=dp[k-1][j-(i-k)];//一定要删除重复的情况,如果s[k]与s[i]相等,那么删除[k,i-1]的所有字符和[k+1,i]的所有字符就是重复情况
break;
}
}
}
}
sum=dp[m][0]+dp[m][1]+dp[m][2]+dp[m][3];
printf("%lld\n",sum);
return 0;
}
L3-020 至多删三个字符 (30 分)(dp)
最新推荐文章于 2025-03-24 16:57:10 发布