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;
}