1 条题解

  • 0
    @ 2026-7-4 22:56:27

    #include <cstdio>
    const int M = 305;
    const int MOD = 998244353;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,b[M],v[M][M],a[M][M][M],dp[M][M][M];
    signed main()
    {
    	n=read();m=read();
    	for(int i=1;i<=m;i++)
    	{
    		int l=read(),r=read();
    		v[l][r]=1;
    	}
    	for(int r=1;r<=n;r++)
    	{
    		for(int l=1;l<=r;l++)
    			if(v[l][r]) b[l]=r;
    		for(int l=r;l>=1;l--)
    		{
    			for(int i=1;i<=n;i++)
    				a[l][r][i]=a[l+1][r][i];
    			for(int i=l;i<=b[l];i++)
    				a[l][r][i]=l;
    		}
    	}
    	for(int i=0;i<=n;i++) for(int l=1;l+i-1<=n;l++)
    	{
    		int r=l+i-1,f=0;
    		for(int i=l;i<=r;i++) f|=a[l][r][i];
    		if(!f)
    		{
    			for(int i=l-1;i<=r+1;i++)
    				dp[l][r][i]=1;
    			continue;
    		}
    		for(int i=l;i<=r;i++) if(a[l][r][i])
    			dp[l][r][i]=1ll*dp[l][i-1][a[l][r][i]]*
    			dp[i+1][r][i+1]%MOD;
    		for(int i=r-1;i>=l;i--)
    			dp[l][r][i]=(dp[l][r][i]+dp[l][r][i+1])%MOD;
    	}
    	printf("%d\n",dp[1][n][1]);
    }
    
    
    • 1

    信息

    ID
    8081
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者