这个题数据特别小,于是想到状压多维之流。

状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些

根据15去设计状态是没有前途的,因为按颜色分一定会MLE

这时就考虑根据5分,这样不同颜色就离散了,就可以用离散数学的统计技巧来计算方案

f【已经涂了几个】【剩1次的颜色个数】【剩2次的颜色个数】【剩3次的颜色个数】【剩4次的颜色个数】【剩五次的颜色个数】【最后一次涂的是 剩几次的颜色】

第一维可以滚动数组,第二维可以计算,

然后枚举转移即可,这里加了一批可行性剪枝,能跑70ms

注:静态差错效果极好

码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define P 1000000007
long long f[2][16][16][16][16][6],K,a[6],sum,x,i,j,k,l,yi,er,san,si,wu,ci,o,last;
int main()
{scanf("%lld",&K);for(i=1;i<=K;i++)scanf("%lld",&x),sum+=x,a[x]++;f[1][a[2]][a[3]][a[4]][a[5]][0]=1;for(ci=1;ci<=sum;ci++,o^=1)//进行第几次安放 {memset(f[o],0,sizeof(f[o]));for(er=0;er<=15;er++)//第二个余剩 {if(er*2>sum-ci+1)continue;for(san=0;san<=15;san++)//第三个余剩 {if(er*2+san*3>sum-ci+1)continue;for(si=0;si<=15;si++)//第四个余剩{if(er*2+san*3+si*4>sum-ci+1)continue;   for(wu=0;wu<=15;wu++)//第五个余剩 {if(er*2+san*3+si*4+wu*5>sum-ci+1)continue;yi=sum-ci+1-er*2-san*3-si*4-wu*5;for(last=0;last<=5;last++)//上一个安放的 {if(f[o^1][er][san][si][wu][last]==0)continue;if(wu)f[o][er][san][si+1][wu-1][5]+= f[o^1][er][san][si][wu][last]*wu;//5->4if(wu)f[o][er][san][si+1][wu-1][5]%=P;if(si)f[o][er][san+1][si-1][wu][4]+= f[o^1][er][san][si][wu][last]*1ll*(last==5?si-1:si);//4->3if(si)f[o][er][san+1][si-1][wu][4]%=P;if(san)f[o][er+1][san-1][si][wu][3]+= f[o^1][er][san][si][wu][last]*1ll*(last==4?san-1:san);//3->2if(san)f[o][er+1][san-1][si][wu][3]%=P;if(er)f[o][er-1][san][si][wu][2]+= f[o^1][er][san][si][wu][last]*1ll*(last==3?er-1:er);//2->1if(er)f[o][er-1][san][si][wu][2]%=P;f[o][er][san][si][wu][1]+= f[o^1][er][san][si][wu][last]*1ll*(last==2?yi-1:yi);//1->0        f[o][er][san][si][wu][1]%=P;}}     }   }   }   }printf("%lld",f[o^1][0][0][0][0][1]);
}

2017.10.29 染色方案 思考记录相关推荐

  1. 2017.10.29 软件安装 思考记录

    这个题一开始卡了,,就是树内的必选和可选分不太清 ,其实很好分,对于一个子树,根是必选,子节点是可选 然后递归保证正确性 可选就是把每个花费都看成一个物品往里背包 注: 1.必选<c[o]的要清 ...

  2. 2017.10.30 覆盖问题 思考记录

    从细节入手已经从一种技巧变成一种策略了. 题目给出的条件很奇怪,是3个正方形,, 为什么是3个而不是4个或2个呢.. 于是先用一个大矩形把所有点卡住 然后显然矩形的每个边 都有一个正方形和他在一条直线 ...

  3. 2017.10.24 上升序列 思考记录

    终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...

  4. 2017.10.9 放棋子 思考记录

    .这个题根本没想到错排,但它似乎离散为斜对角之后很有规律,于是打表,推出了式子... 经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排.. f表示答案  g表示 ...

  5. 2017.10.7 括号序列 思考记录

    这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...

  6. 2017.3.29 报表统计 思考记录

    有生之年第一道浙江省选题(虽然历史久远并且很水) 记录每个位置数列的左端点和右端点 维护两颗splay   一颗维护全局最小差值,一颗维护相邻最小差值 对于全局splay:每次插入时记录路径取差值mi ...

  7. 2017.10.26 星际贸易 思考记录

    这个题非常繁琐,而且网上的题解非常不详细.. 首先第一问 由于所有的点都要走到,所以就是01背包 需要可持久化背包来输出方案..类似floyd的判断方式 然后这些选定的点都一定是要维护的, 第二问就是 ...

  8. 2017.10.25 打鼹鼠 思考记录

    挺直白的dp 离散的是移动的过程,因为经过一番移动一定是为了出现在某个地点 所以直接m^2枚举,类似lis的转移即可 码: #include<iostream> #include<c ...

  9. 2017.10.19 大陆争霸 思考记录

    一上来想到拓扑分层最短路,但需要多源最短路.. 这题考查的是对dij的理解 dij只能跑最短路每次都找极值点进行一次拓展,同时不能有负边权 所以一次需要确定  两个值都确定的一个点所以扩展的条件有两个 ...

最新文章

  1. 如何把Windows安装的所有打印机列出来
  2. 后赛门铁克时代Veritas加强数据保护应对欧盟法规
  3. 常用的正则表达式(持续更新。。)
  4. mysql外键约束脚本_如何在MySQL中设置外键约束
  5. 每周一起读 × 招募 | WWW 2019:基于层次化强化学习的多源搜索展示优化
  6. [转]SqlServer2005 各版本区别
  7. ecshop flow.php goods_number,修复ECSHOP一重要BUG,当商品设置数量优惠时,加入不同属性的商品数量优惠判断错误...
  8. 宝塔linux_Linux虚拟机上快速搭建宝塔 部署PHP运行环境
  9. Ssm手机电脑自适应新闻博客系统实战开发
  10. 新闻网页制作源代码_Python爬虫百度新闻标题,并且做简单的数据分析!挺简单的
  11. Polka.Domain完成40万美元私募轮融资
  12. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_6_字符输出流写数据的其他方法...
  13. sqlserver2017不允许保存更改
  14. java中数据库查询_在java中对数据库查询
  15. 服务器虚拟化怎么配置,教你如何配置服务器虚拟化环境
  16. 曾经的荣誉,偶然被唤醒
  17. python 爬取 谷歌以及百度图片
  18. Matlab roundn()函数使用样例
  19. 如何用VBA制作工资条
  20. 谷歌浏览器注入的样式表 (更改了我网页的样式)

热门文章

  1. 图像处理中提取中间特征是干什么_PyTorch提取中间层特征?
  2. 文字超过省略_纯CSS实现“文本溢出截断省略”的几种方法
  3. 红橙Darren视频笔记 IOC注解框架 自己写个注解框架
  4. crash分析 (如何确定主进程死掉的点)
  5. Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image
  6. LeetCode-203:移除链表元素
  7. leetcode第21题: 合并两个有序链表
  8. sqlite 复合唯一索引_SQLite 索引(Index)
  9. 哪些情况下sql索引会失效
  10. 编程实现Strassen矩阵乘法