[BZOJ2461][BeiJing2011]符环(记忆化搜索)

来源:互联网 发布:会计应对大数据时代 编辑:程序博客网 时间:2024/06/13 18:22

题目描述

传送门

题解

记忆化搜索,表示完全想不到。
当时暴力能打出表来还是很开心的。
谁知道打表。。。
诶~

状态可以表示为:now是当前的字符,x为now左边有多少个’(‘,y为now右边有多少个’)‘,z为now右边有多少个’(’,它们都没有匹配。
然后根据当前字符的不同,分别有两种可能性,然后记搜即可以了。

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define LL long longconst 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手都生了啊!

0 0