【DP】-Codeforces Round #110 (Div. 1)-C. Cipher

個人覺得很神奇的一道DP……

題目要求求出給出字符串經過題目要求的變換可以得到多少各不同的字符串。可以證明的是,這些字符串加起來的和都一樣,所以dp[i][j]的i表示的是字符串的長度,j表示的是字符串所有字母加起來的和,狀態轉移方程爲dp[i+1][j+k]+=dp[i][j](1<=k<=26).

題目

#include<iostream>
#include<cstdio>
using namespace std;
#define mod 1000000007 
int dp[105][2650];
int main()
{
	//freopen("a.txt","r",stdin);
	int i,j,k,m,n,t;
	char s[105];
	memset(dp,0,sizeof(dp));
	for(dp[0][0]=1,i=0;i<100;i++)
		for(j=0;j<=2600;j++)
			if(dp[i][j])
			{
				for(k=1;k<=26;k++)			
					(dp[i+1][j+k]+=dp[i][j])%=mod;
			}
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",s);
		n=strlen(s);
		m=0;
		for(i=0;i<n;i++)
			m+=s[i]-'a'+1;
		printf("%d\n",dp[n][m]-1);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章