我是靠谱客的博主 欣慰犀牛,最近开发中收集的这篇文章主要介绍CodeForces 156 C.Cipher(dp),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Description

给出一个字符串,每次可以把相连两个字母一个变成字母表前一个一个变成字母表后一个,问最多可以形成多少个不同的字符串

Input

第一行一整数 T(T10000) 表示用例组数,每组用例输入一个只由小写字母组成的字符串,长度不超过 100

Output

对于每组用例,输出最多可以形成多少个不同的字符串,结果模 109+7

Sample Input

1

ab

Sample Output

1

Solution

操作其实就是把这个字符串的总权值(每个字符的 ASCII 码之和)重新分配, dp[i][j] 表示前 i 个字符ASCII(减去 a 的)之和为 j 的方案数,枚举第i个位置所放字符为 a+k ,则有转移方程 dp[i][j+k]+=dp[i1][j]

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=105;
#define mod 1000000007
int T,dp[maxn][maxn*26];
char s[maxn];
int main()
{
dp[0][0]=1;
for(int i=1;i<=100;i++)
for(int j=0;j<=(i-1)*26;j++)
for(int k=0;k<26;k++)
{
dp[i][j+k]+=dp[i-1][j];
if(dp[i][j+k]>=mod)dp[i][j+k]-=mod;
}
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
int len=strlen(s),res=0;
for(int i=0;i<len;i++)res+=s[i]-'a';
printf("%dn",dp[len][res]-1);
}
return 0;
}

最后

以上就是欣慰犀牛为你收集整理的CodeForces 156 C.Cipher(dp)的全部内容,希望文章能够帮你解决CodeForces 156 C.Cipher(dp)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部