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

题目描述

传送门

题解

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

状态可以表示为: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手都生了啊!

你可能感兴趣的:([BZOJ2461][BeiJing2011]符环(记忆化搜索))