链接
题意:
给出你一个字符串,让你取子序列,不能连续取字符,问你有多少种方案数?对 1 e 9 + 7 1e9+7 1e9+7
分析:
我们假设当前位置
i
i
i,
d
p
[
i
]
dp[i]
dp[i]是以
i
i
i结尾的方案数。那么我们知道如果前面有一个与
i
i
i位置字符一致的字符假设是
j
j
j那么dp[j]这个位置前面的贡献都已经被j这个位置取了,所以从dp[j]这个位置往前都不会再计算了。这样看来我们需要维护的复杂度最大是26N的。
这样我们再考虑不能连续字符,那么我们就跳过一个字符不就可以了。当前位置为i,我们记录答案为
d
p
[
i
+
2
]
dp[i+2]
dp[i+2]这是以
i
i
i为结尾。相当于整体移动两位。
ababba
**ababba
下面那个是维护答案的,上面那个是原字符串。那这样我们就可以维护以
i
i
i结尾的字符串,那么就需要判断从(i-1)字符开始前面的与
i
i
i位置的字符时候相等,相等就不用再管了。
string str;
ll ans[maxn];
void solve()
{
cin>>str;
ans[0]=1;
for(int i=0;i<str.size();i++){
for(int j=i;;j--){
ans[i+2]=(ans[i+2]+ans[j]) %mod;
if(j==0||str[j-1]==str[i]) break;
}
}
ll sum=0;
for(int i=2;i<str.size()+2;i++){
sum += ans[i];
sum=sum%mod;
}
cout<<sum<<endl;
}