HDU 5642 King's Order 数位dp

题意:n长度的字符串,连续相同的字母不能超过3次,问有多少种组合方式。


想法:dp[a][b],当前为第a位,前面连续相同的加上第a个一共b个,这时有dp[a][b]种可能。初始化dp[0][1]=26,这样初始化显然第一位和第二位数第三位数可以随意放。

当b=2,3时显然他们是可以随便放的所以他的虽有可能就是dp[a-1][b]%mod;因为他就要放的和前面一样,当然是可能的个数不变啦。

当b=1时显然他前面的一个可以有连续一个相同的,两个相同的,三个相同的,但是他不和前面的相同,所以他的可能个数就是(dp[a-1][1]+dp[a-1][2]+dp[a-1][3])*25。

这里×25表明这一个一定不与前一个相同。


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const __int64 mod=1e9+7;
__int64 dp[2005][4];
int main()
{
    int test;
    dp[0][1]=26;
    for(int i=1;i<=2000;i++)
    {
        dp[i][2]=dp[i-1][1]%mod;
        dp[i][3]=dp[i-1][2]%mod;
        dp[i][1]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][3])%mod*25;
    }
    scanf("%d",&test);
    while(test--)
    {
        int n;
        scanf("%d",&n);
        printf("%I64d\n",(dp[n-1][1]+dp[n-1][2]+dp[n-1][3])%mod);
    }
    return 0;
}

你可能感兴趣的:(HDU 5642 King's Order 数位dp)