Nowcoder practice 60 C.操作集锦
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+7;
int dp[1010][1010][27];//dp[i][j][k]前i个字符中长度为j以'a'+k结尾的不同本质的子序列个数
int main(){
ll t,i,j,n,k,m=0;
cin>>n>>m;
string s;
cin>>s;
if(m==0){cout<<1;return 0;}
for(i=1;i<=n;i++){
dp[i][1][s[i-1]-'a']=1;//控制初始条件前i个字符长度为1不同本质的子序列要么为1要么为0.不可能为其他值
for(j=1;j<=m;j++){//枚举长度
for(k=0;k<26;k++){//枚举结尾字符
if(s[i-1]==k+'a'){//如果结尾是k+'a'这个字符
for(t=0;t<26;t++)dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-1][t])%mod;//加上前i-1个字符长度为j-1的子序列的所有情况
}
else dp[i][j][k]=dp[i-1][j][k]%mod;//否则不用更新
}
}
}
ll res=0;
for(i=0;i<26;i++)res=(res+dp[n][m][i])%mod;
cout<<res;
}