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

时间:2023-03-08 16:21:21
随机字符串

题目描述

起名字什么的最麻烦,我们来生成一些随机字符串吧
生成的字符串当然是有要求的:
.长度不能超过n
.字符串中仅包含大写字母
.生成的字符串必须包含字符串“ACM” ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 输入一个正整数T,代表有T组数据
接下来T行,每行一个正整数n,n<=。 输出 输出符合条件的字符串的数目 样例输入 样例输出

题解:

using namespace std;
#define inf 0x3f3f3f3f
#define N 110
#define ll long long ll dp[][]; ll dfs(int len,int st)
{
if(len<){
if(st==)return ;
return ;
}
if(dp[len][st]!=-)return dp[len][st];
ll s=;
for(char i='A';i<='Z';i++){
if(st==)
s+=dfs(len-,);
else if(i=='A')
s+=dfs(len-,);
else if(i=='C')
s+=dfs(len-, st==?:);
else if(i=='M')
s+=dfs(len-,st==?:);
else
s+=dfs(len-,);
}
dp[len][st]=s;
return s;
} int main(){ int T;
cin>>T;
memset(dp,-,sizeof(dp));
while(T--){
int n;
cin>>n; ll sum=;
for(int i=;i<=n;i++){
sum+=dfs(i,-);
}
cout<<sum<<endl;
} return ;
}

(超简洁!!超简洁!)