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 }