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;
}
本文详细介绍了如何使用动态规划解决Codeforces竞赛C题的问题,即计算可以由给定字符串通过替换操作得到的所有不同字符串的数量。通过预处理求解长度为i总和为j的字符串的数量,并利用转移方程进行计数。
533

被折叠的 条评论
为什么被折叠?



