CodeForces 156C Cipher

一道神奇的dp题。。。

//字符串不管如何处理,其ASCII码总和不变,故凡是长度相同,字母和相同的串都可以转换 
//所以f[i][j]的i表示的是字符串的长度,j表示的是字符串所有字母加起来的和,状态转移方程为f[i+1][j+k]+=f[i][j](1<=k<=26). 

#include<stdio.h>

#include<stdlib.h> 
#include<string.h>
#define mod 1000000007
char s[110];
int f[110][3000];
int main()
{
  int t,i,j,k,len;
  int sum; 
  memset(f,0,sizeof(f)); 
  f[0][0]=1;
  for(i=0;i<=105;i++)
    for(j=0;j<3000;j++){ 
       if(f[i][j]>0){ 
         for(k=0;k<26;k++){   
            f[i+1][j+k]+=(f[i][j]%mod);
            f[i+1][j+k]%=mod;
         }                 
       }
    }
  scanf("%d",&t);
  while(t--){
    scanf("%s",s);
    len=strlen(s); 
    sum=0;
    for(i=0;i<len;i++){
      sum+=s[i]-'a';                 
    }
    printf("%d\n",f[len][sum]-1);              
  }  
  //system("pause"); 
  return 0;    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值