bzoj1079[SCOI2008]着色方案

摘要:
e) 返回1;ifretrndp[a][b][c][d][e][last];LLret=0;ifret+=dfs*;ret%=模;ifret+=dfs*;ret%=模;ifret+=dfs*;ret%=模;ifret+=dfs*;ret%=模;ifret+=dfs*e;//最后一个等价类已转移到论文last1ret%=mod;returndp[a][b][c][d][e][last]=ret;}intC[maxn];intmain(){intn=read();forC[read(()]++;printf;return0;}

题目链接

bzoj1079[SCOI2008]着色方案

题解

状态设计好神呐
dp[a][b][c][d][e][last]
表示剩余1个的有a中,2个的有b中三个的有c中....
last表示上次转移的种类
然后记忆化搜索一下
乘法原理转移

代码

#include<cstdio>
#include<algorithm>
inline int read () {
    int x = 0,f = 1;
    char c = getchar();
    while(c <= '0' || c > '9') {if(c == '-')f = -1;c = getchar();} 
    while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
    return x * f;
}
#define LL long long
const int mod = 1e9 + 7;
const int maxn = 19;
LL dp[maxn][maxn][maxn][maxn][maxn][7];
LL dfs(int a,int b,int c,int d,int e,int last) { //last 安放改点的等价类与上次等价类变化后相同,减掉
    if(!a && !b && !c && !d && !e) return 1;
    if(dp[a][b][c][d][e][last]) return dp[a][b][c][d][e][last]; 
    LL ret = 0;
    if(a) ret +=dfs(a - 1,b,c,d,e,1) * (a - (last == 2)) ;
    ret %= mod;
    if(b) ret +=dfs(a + 1,b - 1,c,d,e,2) * (b - (last == 3)) ;
    ret %= mod;
    if(c) ret +=dfs(a ,b + 1,c - 1,d,e,3) * (c - (last == 4)) ;
    ret %= mod;
    if(d) ret +=dfs(a,b,c + 1,d - 1,e,4) * (d - (last == 5)) ;
    ret %= mod; 
    if(e) ret +=dfs(a,b,c,d + 1,e - 1,5) * e ;// 上次等价类已经转移纸last - 1
    ret %= mod;
    return dp[a][b][c][d][e][last] = ret;
}
int C[maxn];
int main() {
       int n = read();	
    for(int i = 1;i <= n ;++ i)  C[read()] ++; 
    printf("%lld
",dfs(C[1],C[2],C[3],C[4],C[5],0) % mod);
    return 0;
}

免责声明:文章转载自《bzoj1079[SCOI2008]着色方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇luogu P2134 百日旅行bzoj4543[POI2014]Hotel下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[bzoj3729]Gty的游戏

来自FallDream的博客,未经允许,请勿转载,谢谢。 某一天gty在与他的妹子玩游戏。妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略。gty很快计算出了策略。但gty的妹子十分机智,她决定修改某个节点的石子或加入某个新节点。gty不忍心打击妹子,所...

swiper 视频轮番

百度搜索:swiper 视频轮番 转载1:https://blog.csdn.net/Aimee1608/article/details/79637929 项目中使用swiper插件嵌套video标签 正常的swiper插件里面嵌套video标签,如下写法就够了,在ios 和PC端上完全没有问题,但是在安卓机上,播放视频后,视频的层级会居上,覆盖住下面...

oracle 函数2

73。COVAR_SAMP 功能描述:返回一对表达式的样本协方差SAMPLE:下例CUM_COVS返回定价和最小产品价格的累积样本协方差SELECT product_id, supplier_id,COVAR_POP(list_price, min_price) OVER (ORDER BY product_id, supplier_id) AS CUM_C...

mysql获取插入时自增ID值的方法

1. LAST_INSERT_ID: LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。 LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCR...

nginx rewrite 参数和例子

http://www.cnblogs.com/analyzer/articles/1377684.html ] 本位转自:http://blog.c1gstudio.com/archives/434 推荐参考地址:Mailing list ARChives 官方讨论区http://marc.info/?l=nginx Nginx 常见应用技术指南[Nginx...

创建Oracle synonym 详解

--创建使用同义词 --同义词就是给表、视图等对象取得别名,用于简化对其的访问 --分为2种: --私有同义词:用户自己创建自己使用的 --公共同义词:dba创建,给其它用户使用的 --为dept_sum_vu视图创建一个同义词 --不使用public关键字创建的同义词就叫做私有同义词 create synonym d_sumfor dept_sum_v...