zoukankan      html  css  js  c++  java
  • bzoj1079: [SCOI2008]着色方案

    1079: [SCOI2008]着色方案

    Time Limit: 10 Sec  Memory Limit: 162 MB

    Description

      有n个木块排成一行,从左到右依次编号为1~n。你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块。
    所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n。相邻两个木块涂相同色显得很难看,所以你希望统计任意两
    个相邻木块颜色不同的着色方案。

    Input

      第一行为一个正整数k,第二行包含k个整数c1, c2, ... , ck。

    Output

      输出一个整数,即方案总数模1,000,000,007的结果。

    Sample Input

    3
    1 2 3

    Sample Output

    10

    HINT

     100%的数据满足:1 <= k <= 15, 1 <= ci <= 5

    Source

    所以用F[a][b][c][d][e][l]表示当前有能涂1次的油漆a个,能涂2次的b个….前一个颜色为l,再搞下转移就行了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #define ll long long
     4 #define mod 1000000007
     5 using namespace std;
     6 ll f[16][16][16][16][16][6];int x[6],n;
     7 bool mark[16][16][16][16][16][6];
     8 ll dp(int a,int b,int c,int d,int e,int k)
     9 {
    10     ll t=0;
    11     if(mark[a][b][c][d][e][k])return f[a][b][c][d][e][k];
    12     if(a+b+c+d+e==0)return 1;
    13     if(a)  
    14         t+=(a-(k==2))*dp(a-1,b,c,d,e,1);  
    15     if(b)  
    16         t+=(b-(k==3))*dp(a+1,b-1,c,d,e,2);  
    17     if(c)  
    18         t+=(c-(k==4))*dp(a,b+1,c-1,d,e,3);  
    19     if(d)  
    20         t+=(d-(k==5))*dp(a,b,c+1,d-1,e,4);  
    21     if(e)  
    22         t+=e*dp(a,b,c,d+1,e-1,5);  
    23     mark[a][b][c][d][e][k]=1;
    24     return f[a][b][c][d][e][k]=(t%mod);
    25 }
    26 int main()
    27 {
    28     scanf("%d",&n);
    29     for(int i=1;i<=n;i++)
    30     {
    31             int t;
    32             scanf("%d",&t);
    33             x[t]++;
    34             }
    35     printf("%lld",dp(x[1],x[2],x[3],x[4],x[5],0));
    36     return 0;
    37 }
  • 相关阅读:
    mysql版本问题
    敏感词过滤
    身份证校验-----15位,18位后端
    身份证号校验---------前端
    layui时间显示
    第一次入坑docker
    mysql索引解析
    mysql数据库索引调优
    设计模式-代理模式
    c#中abstract与virtua、overridel的用法
  • 原文地址:https://www.cnblogs.com/WQHui/p/8575529.html
Copyright © 2011-2022 走看看