周中训练 DAY1
题意
给一个长度是n的仅含有小写字母的字符串s,求s 的不同非空子序列一共有多少个,答案对1e9+7取模
下面给出子序列定义:
字符串的 子序列 是经由原字符串删除k个(k有可能等于0)字符但不改变剩余字符相对位置的一个新字符串。
1<=n<=2000
原思路
肯定有比我更容易的想法。
我认为硬做不好,所以反过来想,直接对子序列进行讨论。
那么考虑
(我也是尝试多次后才有这样的状态定义的)
那么考虑将
那么就能发现,这样转移不会漏解,因为
这而判断
(我是定义
现思路
完全没必要设 长度 这一维啊!
直接令
从 我为人人 的角度看,令
归根结底,还是思维有所固化所导致的。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e3+5,mod=1e9+7;
int n,f[N]={1},p[N][30],ans;
string s;
signed main(){
cin>>s; n=s.size(); s=" "+s;
for(int i=n; i>=1;i--){
for(int j=0; j<26;j++) p[i][j]=p[i+1][j];
p[i][s[i]-'a']=i;
}
for(int i=0; i<n;i++){
for(int j=0; j<26;j++)
if(p[i+1][j]) f[p[i+1][j]]=(f[p[i+1][j]]+f[i])%mod;
ans=(ans+f[i])%mod;
}
cout<<(ans+f[n]-1)%mod;
return 0;
}