【HDOJ6578】Blank(DP)

题意:一个长为n的序列,每个位置上的值是0,1,2,3中的一个,有m个限制条件,限制位置[l[i],r[i]]中不同的数值有x[i]个,问方案数MOD 998244353

n<=100,m<=100

思路:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef pair<int,int> PII;
  7 typedef pair<ll,ll> Pll;
  8 typedef vector<int> VI;
  9 typedef vector<PII> VII;
 10 typedef pair<ll,int>P;
 11 #define N  110
 12 #define M  151000
 13 #define fi first
 14 #define se second
 15 #define MP make_pair
 16 #define pi acos(-1)
 17 #define mem(a,b) memset(a,b,sizeof(a))
 18 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 19 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 20 #define lowbit(x) x&(-x)
 21 #define Rand (rand()*(1<<16)+rand())
 22 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 23 #define ls p<<1
 24 #define rs p<<1|1
 25 
 26 const int MOD=998244353,inv2=(MOD+1)/2;
 27       double eps=1e-6;
 28       ll INF=1e18;
 29       ll inf=5e13;
 30       int dx[4]={-1,1,0,0};
 31       int dy[4]={0,0,-1,1};
 32 
 33 int dp[2][N][N][N];
 34 VII c[N];
 35 
 36 int read()
 37 {
 38    int v=0,f=1;
 39    char c=getchar();
 40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 42    return v*f;
 43 }
 44 
 45 void calc(int &a,int b)
 46 {
 47     a+=b;
 48     if(a>=MOD) a-=MOD;
 49 }
 50 
 51 int main()
 52 {
 53     //freopen("1.in","r",stdin);
 54     //freopen("1.out","w",stdout);
 55     int cas=read();
 56     while(cas--)
 57     {
 58         int n=read(),m=read();
 59         rep(i,1,n) c[i].clear();
 60         rep(i,1,m)
 61         {
 62             int x=read(),y=read(),z=read();
 63             //printf("x=%d y=%d z=%d\n",x,y,z);
 64             c[y].push_back(MP(x,z));
 65         }
 66         rep(i,0,n)
 67          rep(j,0,n)
 68           rep(k,0,n) dp[0][i][j][k]=0;
 69         dp[0][0][0][0]=1;
 70         int v=0;
 71         rep(i,1,n)
 72         {
 73             v^=1;
 74             rep(j,0,i)
 75              rep(k,0,j)
 76               rep(t,0,k) dp[v][j][k][t]=0;
 77             rep(j,0,i-1)
 78              rep(k,0,j)
 79               rep(t,0,k)
 80               {
 81                     calc(dp[v][j][k][t],dp[1-v][j][k][t]);
 82                     calc(dp[v][i-1][k][t],dp[1-v][j][k][t]);
 83                     calc(dp[v][i-1][j][t],dp[1-v][j][k][t]);
 84                     calc(dp[v][i-1][j][k],dp[1-v][j][k][t]);
 85               }
 86             rep(j,0,i-1)
 87              rep(k,0,j)
 88               rep(t,0,k)
 89               {
 90                   for(int x=0;x<c[i].size();x++)
 91                   {
 92                       PII tmp=c[i][x];
 93                       if((j>=tmp.fi)+(k>=tmp.fi)+(t>=tmp.fi)+1!=tmp.se) dp[v][j][k][t]=0;
 94                   }
 95               }
 96         }
 97         int ans=0;
 98         rep(i,0,n-1)
 99          rep(j,0,i)
100           rep(k,0,j) calc(ans,dp[v][i][j][k]);
101         printf("%d\n",ans);
102 
103     }
104     return 0;
105 }

猜你喜欢

转载自www.cnblogs.com/myx12345/p/11543105.html