【dp】Codeforces Round #110 (Div. 1) C

http://codeforces.com/contest/156/problem/C

可以发现所有可以转化的串的字符总和都相同,所以可以先预处理求出长度为i总和为j的字符串有多少个,转移方程很容易写

#define MOD 1000000007
LL dp[110][26*110];
char str[110];
void init(){
    int i,j,k;
    memset(dp,0,sizeof(dp));
    dp[0][0] = 1;
    for(i=1;i<=100;i++){
        for(j=1;j<=26*i;j++){
            for(k=1;k<=26;k++){
                if(j-k>=0){
                dp[i][j] = (dp[i][j] + dp[i-1][j-k]) % MOD;
                }
            }
        }
    }
}
int main(){
    init();
    int n;
    cin>>n;
    while(n--){
        cin>>str;
        int len = strlen(str);
        int i,j;
        int sum = 0;
        for(i=0;i<len;i++){
            sum += str[i]-'a'+1;
        }
        cout<<dp[len][sum]-1<<endl;
    }
    return 0;
}





















你可能感兴趣的:(【dp】Codeforces Round #110 (Div. 1) C)