【记忆化搜索/数位DP】zznu2175(长度为n的含有ACM的字符串)

随机字符串

题目描述

起名字什么的最麻烦,我们来生成一些随机字符串吧
生成的字符串当然是有要求的:
1.长度不能超过n
2.字符串中仅包含大写字母
3.生成的字符串必须包含字符串“ACM”

ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个

输入

输入一个正整数T,代表有T组数据 
接下来T行,每行一个正整数n,n<=10。 

输出

输出符合条件的字符串的数目

样例输入

1
3


样例输出

1

题解:

using namespace std;
#define inf 0x3f3f3f3f
#define N 110
#define ll long long

ll dp[12][5];

ll dfs(int len,int st)
{
    if(len<1){
        if(st==3)return 1;
        return 0;
    }
    if(dp[len][st]!=-1)return dp[len][st];
    ll s=0;
    for(char i='A';i<='Z';i++){
        if(st==3)
            s+=dfs(len-1,3);
        else if(i=='A')
            s+=dfs(len-1,1);
        else if(i=='C')
            s+=dfs(len-1, st==1?2:0);
        else if(i=='M')
            s+=dfs(len-1,st==2?3:0);
        else
            s+=dfs(len-1,0);
    }
    dp[len][st]=s;
    return s;
}

int main(){

    int T;
    cin>>T;
    memset(dp,-1,sizeof(dp));
    while(T--){
        int n;
        cin>>n;

        ll sum=0;
        for(int i=1;i<=n;i++){
            sum+=dfs(i,-1);
        }
       cout<<sum<<endl;
    }

    return 0;
}
View Code(超简洁!!超简洁!)
你不逼自己一把,你永远都不知道自己有多优秀!只有经历了一些事,你才会懂得好好珍惜眼前的时光!
原文地址:https://www.cnblogs.com/zhazhaacmer/p/9768916.html