[区间DP 思路题] BZOJ 4350 括号序列再战猪猪侠

来源:互联网 发布:微信附近人采集软件 编辑:程序博客网 时间:2024/06/09 23:26

蒟蒻不会做
这里讲的蛮详细的

#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#define read(x) scanf("%d",&(x))#define cl(x) memset(x,0,sizeof(x))using namespace std;typedef long long ll;const int P=998244353;const int N=305;int n,m;int s[N][N];inline int sum(int a,int b,int c,int d){  return s[c][d]-s[c][b-1]-s[a-1][d]+s[a-1][b-1];}ll f[N][N];int main(){  int Q,x,y;  freopen("t.in","r",stdin);  freopen("t.out","w",stdout);  read(Q);  while (Q--){    read(n); read(m); int flag=0;    for (int i=1;i<=m;i++) {      read(x),read(y),s[x][y]=1;      if (x==y && !flag)    printf("0\n"),flag=1;    }    if (flag) goto W;    for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) s[i][j]+=s[i-1][j];    for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) s[i][j]+=s[i][j-1];    for (int i=1;i<=n;i++) f[i][i]=1;    for (int l=2;l<=n;l++)      for (int i=1;i+l-1<=n;i++){    int j=i+l-1;    if (!sum(i,i+1,i,j)) (f[i][j]+=f[i+1][j])%=P;    if (!sum(i+1,i,j,i)) (f[i][j]+=f[i+1][j])%=P;    for (int k=i+1;k<=j-1;k++)      if (!sum(k+1,i,j,k) && !sum(i,i+1,i,k))        (f[i][j]+=f[i+1][k]*f[k+1][j]%P)%=P;      }    printf("%lld\n",f[1][n]);  W:cl(f); cl(s);  }  return 0;}
0 0