[dp] Jzoj P5870 地图

Description

 

Input

Output

 

Sample Input

4
2 1 1 2

Sample Output

2
 

Data Constraint

 

 

题解

  • 设f[i][j]为剩下i个1,j个2的地图数量
  • 如果2号用了一条边就是1号点了
  • 根据情况dp

代码

 1 #include <cstdio>
 2 using namespace std;
 3 int n,num[3],f[2010][2010],mo=998244353;
 4 int main()
 5 {
 6     freopen("map.in","r",stdin);freopen("map.out","w",stdout);
 7     scanf("%d",&n);
 8     for (int x,i=1;i<=n;i++) scanf("%d",&x),num[x]++;
 9     f[0][0]=1;
10     for (int i=0;i<=n;i++)
11         for (int x=i;x>=0;x--)
12         {    
13             int y=i-x;
14             if (x>=1&&y==0) (f[x+1][y]+=1ll*f[x-1][y]*x%mo)%=mo;
15             if (x>=2) (f[x][y+1]+=1ll*f[x-2][y]*((1ll*x*(x-1)/2)%mo)%mo)%=mo;
16             if (y>=2) (f[x][y+1]+=1ll*f[x+2][y-2]*((1ll*y*(y-1)/2)%mo)%mo)%=mo;
17             if (i*x) (f[x][y+1]+=1ll*f[x][y-1]*x%mo*y%mo)%=mo;
18         }
19     printf("%d",f[num[1]][num[2]]);
20 }

 

posted @ 2018-09-21 21:12  BEYang_Z  阅读(149)  评论(0编辑  收藏  举报