hdu 5642 King's Order【数位DP】

King's Order

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 466    Accepted Submission(s): 282


Problem Description
After the king's speech , everyone is encouraged. But the war is not over. The king needs to give orders from time to time. But sometimes he can not speak things well. So in his order there are some ones like this: "Let the group-p-p three come to me". As you can see letter 'p' repeats for 3 times. Poor king!

Now , it is war time , because of the spies from enemies , sometimes it is pretty hard for the general to tell which orders come from the king. But fortunately the general know how the king speaks: the king never repeats a letter for more than 3 times continually .And only this kind of order is legal. For example , the order: "Let the group-p-p-p three come to me" can never come from the king. While the order:" Let the group-p three come to me" is a legal statement.

The general wants to know how many legal orders that has the length of n

To make it simple , only lower case English Letters can appear in king's order , and please output the answer modulo  1000000007

We regard two strings are the same if and only if each charactor is the same place of these two strings are the same.
 

Input
The first line contains a number  T(T10) ——The number of the testcases.

For each testcase, the first line and the only line contains a positive number  n(n2000) .
 

Output
For each testcase, print a single number as the answer.
Sample Input
2
2
4
 


Sample Output
676
456950


hint:
All the order that  has length 2 are legal. So the answer is 26*26.


For the order that has length 4. The illegal order are : "aaaa" , "bbbb"…….."zzzz" 26 orders in total. So the answer for n == 4 is 26^4-26 = 456950
 
 



Source
 


中文题干:


国王演讲后士气大增,但此时战争还没有结束,国王时不时要下发命令。

由于国王的口吃并没有治愈,所以传令中可能出现:“让第三军-军-军,到前线去” 这样的命令。由于大洋国在军队中安插了间谍 , 战事紧急,很多时候前线的指挥官不能分清哪些命令真正来自国王。但国王的命令有一个特点,他每次连续重复的字符最多 33 次. 所以说他的命令中没有:“让第三军-军-军-军 , 到前线去”,但是可以有 :“让第三军-军 , 到前线去” 。

此时将军找到了你,你需要告诉他,给定命令的长度长度为 nn,有多少种不同的命令可以是国王发出的 。(也就是求长度为 nn 的合格字符串的个数)当然,国王可能说出一句话没有犯任何口吃,就像他那次演讲一样。

为了简化答案,国王的命令中只含有小写英文字母,且对答案输出模 10000000071000000007。

我们认为两个命令如果完全相同那么这两个字符串逐个比较就完全相同。
输入描述
第一行一个整数表示测试组数:T(T \le10)T(T10)。

每组数据占一行,每行一个正整数 n(n \le 2000)n(n2000) 表示字符串的长度。
输出描述
TT 行,每行一个整数表示合法的命令数量。

思路:数位dp、我们设数组dp【i】【j】表示i长度的字符串最后边有多少个字符相同,根据数据范围我们开dp【2000+】【4】即可。

那么:

dp【i】【1】表示长度为i的字符串最后边有1个字符相同(最后一个字母和倒数第二个字母不同)

dp【i】【2】表示长度为i的字符串最后边有2个字符相同

dp【i】【3】表示长度为i的字符串最后边有3个字符相同

我们不难理解:

dp【i】【2】=dp【i-1】【1】;

dp【i】【3】=dp【i-1】【2】;

而dp【i】【1】=dp【i-1】【1】*25+dp【i-1】【2】*25+dp【i-1】【3】*25;(表示长度为i的字符串最后边有1个字符相同来自长度为i-1的字符串的最后无论多少字符相同都要换一个不同于它的字符);

我们推出了状态转移方程,最后我们上AC代码:

#include<stdio.h>
#include<string.h>
using namespace std;
#define mod 1000000007
#define ll long long int
ll dp[2005][4];
void init()
{
    memset(dp,0,sizeof(dp));
    dp[1][1]=26;
    for(int i=2;i<=2003;i++)
    {
        dp[i][1]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][3])%mod*25;
        dp[i][2]=dp[i-1][1]%mod;
        dp[i][3]=dp[i-1][2]%mod;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    init();
    while(t--)
    {
        int n;
        scanf("%d",&n);
        printf("%I64d\n",(dp[n][1]+dp[n][2]+dp[n][3])%mod);
    }
}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值