P1385 密令

题意:给出一串字符串,让我们根据题目中所示进行更换字符,问不同字符的方案数有多少?

思路:可知,无论怎么变换,总的字符值都不会变换,并且每个位置都可以在总的范围内随意取值

    因此,我们计算出总的字符值(大概3000),然后开始枚举(题目给出最多100个字符)

      dp【i】【j】表示到了第i个字符时总的字符值恰巧等于j时的方案数

        所以我们i从小到大枚举

          再来一维枚举j

            再来每一位可以枚举(0~25)算出总的方案数即可

   注:总的方案数需要减去原本的方案数

   即ans--

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int mod=1e9+7;
 4 int dp[110][3010];
 5 char a[110];
 6 void init()
 7 {
 8     for(int i=0;i<26;i++) dp[1][i]=1;
 9     for(int j=2;j<=100;j++){
10         for(int k=0;k<=3000;k++){
11             for(int i=0;i<26;i++){
12                 if(k-i>=0){
13                     dp[j][k]=(dp[j][k]+dp[j-1][k-i])%mod;
14                 }
15             }
16         }
17     }
18 }
19 int main()
20 {
21     init();
22     int T;
23     scanf("%d",&T);
24     while(T--){
25         scanf("%s",a);
26         int len=strlen(a);
27         int sum=0;
28         for(int i=0;i<len;i++)
29             sum+=a[i]-'a';
30         printf("%d\n",dp[len][sum]-1);
31     }
32     return 0;
33 }
View Code

 

posted @ 2020-04-01 11:38  古比  阅读(180)  评论(0编辑  收藏  举报