• 【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
    ",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
    ",ans);
    102 
    103     }
    104     return 0;
    105 }
  • 相关阅读:
    Html语言基础
    acm练习(四)
    acm练习(三)
    acm练习(二)
    acm练习(一)
    android自定义控件属性
    android ViewGroup getChildDrawingOrder与 isChildrenDrawingOrderEnabled()
    java 用Arrays.binarySearch解读 快速定位数字范围
    android极光推送初步了解...
    GridView与ListView冲突
  • 原文地址:https://www.cnblogs.com/myx12345/p/11543105.html
Copyright © 2020-2023  润新知