题目描述
题解
记忆化搜索,表示完全想不到。
当时暴力能打出表来还是很开心的。
谁知道打表。。。
诶~
状态可以表示为:now是当前的字符,x为now左边有多少个’(‘,y为now右边有多少个’)‘,z为now右边有多少个’(’,它们都没有匹配。
然后根据当前字符的不同,分别有两种可能性,然后记搜即可以了。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long
const int max_n=55;
int t,n;
char s[max_n];
LL f[max_n][max_n][max_n][max_n];
LL dfs(int now,int x,int y,int z){
if (now==n+1)
return z==0&&x==y;
LL &w=f[now][x][y][z];
if (w!=-1) return w;
w=0;
if (s[now]=='S'){
w+=dfs(now+1,x+1,y,z+1);
if (x){
if (z)
w+=dfs(now+1,x-1,y,z-1);
else
w+=dfs(now+1,x-1,y+1,z);
}
}
if (s[now]=='D'){
if (x)
w+=dfs(now+1,x-1,y,z+1);
if (z)
w+=dfs(now+1,x+1,y,z-1);
else
w+=dfs(now+1,x+1,y+1,z);
}
return w;
}
int main(){
scanf("%d",&t);
while (t--){
memset(f,-1,sizeof(f));
scanf("%s",s+1);
n=strlen(s+1);
printf("%lld\n",dfs(1,0,0,0));
}
}
总结
好久不打dp手都生了啊!