题意:商店出售3种颜色的球,分别为红、绿、蓝。

城市里有n个商店,第i个商店在第First_i天开始营业,连续营业Red_i+Green_i+Blue_i天,每个商店每天只能出售一种颜色的球。

每天最多有两个商店同时营业。如果同一天内有两个商店同时营业,那么这两个商店必须出售相同颜色的球。

求不同的出售方案数(对1,000,000,007取模)。两种方案不同,当且仅当某一天某一个商店出售的球的颜色不同。

1≤n≤50
1≤First_i≤500
0≤Red_i, Green_i, Blue_i≤100
0<Red_i + Green_i + Blue_i
First_i + Red_i + Green_i + Blue_i - 1≤500
保证每天最多有两个商店同时营业。
 
思路:WYZ作业 烦的一比 还是膜了本人的code才做出的
贴一下他的题解

我们很容易想到一个7维DP,dp[时间][店A剩余红球][店A剩余绿球][店A剩余蓝球][店B剩余红球][店B剩余绿球][店B剩余蓝球]

然后,首先我们发现,每个时刻一个店的剩余球总数是确定的,于是就可以把其中一个球的状态去掉,于是就变成5维了。

接着,我们尝试不记录其中一个店。

我们发现,如果某一段区间两个店同时开门,那么这段时间内卖掉的球一定是那个较早关门剩余的所有球。(因为较早关门的那个店一定要卖光,然后另一个店就必须跟着卖)

然后这段时间里的方案数,直接可以用组合数算出来。

于是我们就可以直接跳过有2个店开门的时间。

于是我们的DP状态就变成3维的了,空间&&时间都是500*100*100的。

O(1)转移xjb搞一搞就行了

 const mo=;
var st,r,g,b:array[..]of longint;
dp,f:array[..,..]of int64;
c:array[..,-..]of int64;
now,sum,i,j,k,n,t:longint; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l2,r2:longint);
var i,j,mid:longint;
begin
i:=l2; j:=r2; mid:=st[(l2+r2)>>];
repeat
while mid>st[i] do inc(i);
while mid<st[j] do dec(j);
if i<=j then
begin
swap(st[i],st[j]);
swap(r[i],r[j]);
swap(g[i],g[j]);
swap(b[i],b[j]);
inc(i); dec(j);
end;
until i>j;
if l2<j then qsort(l2,j);
if i<r2 then qsort(i,r2);
end; function clac(x,y,z:longint):int64;
begin
clac:=c[x+y+z,x]*c[y+z,y] mod mo;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure solve(step:longint);
var i,j,k:longint;
begin
if step= then exit;
if sum= then
begin
now:=now+step;
exit;
end;
fillchar(f,sizeof(f),);
for i:= to do
for j:= to do
begin
k:=sum-i-j;
if (k<)or(k>) then continue;
if i> then f[i-,j]:=(f[i-,j]+dp[i,j]) mod mo;
if j> then f[i,j-]:=(f[i,j-]+dp[i,j]) mod mo;
if k> then f[i,j]:=(f[i,j]+dp[i,j]) mod mo;
end;
for i:= to do
for j:= to do dp[i,j]:=f[i,j];
inc(now); dec(sum);
solve(step-);
end; begin
assign(input,'bzoj4583.in'); reset(input);
assign(output,'bzoj4583.out'); rewrite(output);
readln(n);
for i:= to n do read(st[i]);
for i:= to n do read(r[i]);
for i:= to n do read(g[i]);
for i:= to n do read(b[i]);
c[,]:=;
for i:= to do
for j:= to i do c[i,j]:=(c[i-,j-]+c[i-,j]) mod mo;
qsort(,n); dp[,]:=;
for t:= to n do
begin
solve(st[t]-now);
fillchar(f,sizeof(f),);
if sum<=r[t]+g[t]+b[t] then
begin
for i:= to r[t] do
for j:= to g[t] do
begin
k:=sum-i-j;
if (k<)or(k>b[t]) then continue;
f[r[t]-i,g[t]-j]:=(f[r[t]-i,g[t]-j]+dp[i,j]*clac(i,j,k)) mod mo;
end;
end
else
begin
for i:=r[t] to do
for j:=g[t] to do
begin
k:=sum-i-j;
if (k<b[t])or(k>) then continue;
f[i-r[t],j-g[t]]:=(f[i-r[t],j-g[t]]+dp[i,j]*clac(r[t],g[t],b[t])) mod mo;
end;
end;
for i:= to do
for j:= to do dp[i,j]:=f[i,j];
now:=now+min(sum,r[t]+g[t]+b[t]);
sum:=abs(r[t]+g[t]+b[t]-sum);
end;
solve();
writeln(dp[,]);
close(input);
close(output);
end.
 

【BZOJ4583】购物(组合计数)的更多相关文章

  1. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  2. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  3. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  4. 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)

    [HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...

  5. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

  6. 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)

    [BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...

  7. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  8. 【BZOJ3142】[HNOI2013]数列(组合计数)

    [BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...

  9. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

  10. 【BZOJ4830】[HNOI2017]抛硬币(组合计数,拓展卢卡斯定理)

    [BZOJ4830][HNOI2017]抛硬币(组合计数,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 暴力是啥? 枚举\(A\)的次数和\(B\)的次数,然后直接组合数算就好了:\(\display ...

随机推荐

  1. Spring MVC 结合Velocity视图出现中文乱码的解决方案

    编码问题一直是个很令人头疼的事,这几天搭了一个Spring MVC+VTL的web框架,发现中文乱码了,这里记录一种解决乱码的方案. 开发环境为eclipse,首先,检查Window->pref ...

  2. RabbitMQ七:交换机类型Exchange Types--Fanout 介绍

    前言 最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 其中之前我们用 ...

  3. jsp中非空判断

    function中uname要和id的值相匹配,但是这样不专业,要显示我的专业性,我将使用document获得name的值来判断是否为空,应为这样是专业的写法,我要时刻记住我是专业的 <scri ...

  4. JData 整合ArtTemplate的前端框架

    因为项目需要和自己的兴趣,几个月前结合模板解析神速的ArtTemplate,自己写了个框架取名JData,多多指教啊---因为一直没时间写文档,为了能够更方便地使用和避免我把代码忘了,今天抽空把文档写 ...

  5. provider模式

    最近看代码有所感想吧.当底层API,发生变化时,可以使用Provider模式.既然是模式就一定的股则. 1.该模式对原有接口的封装. 2.该模式实现对API的封装,不显示细节,从而取消依赖关系. 3. ...

  6. SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询

    连接查询 inner join,用的最多,表示多张表一一对应 聚合函数 操作行数据,进行合并 sum.avg.count.max.min 开窗函数 将合并的数据分布到原表的每一行,相当于多出来了一列, ...

  7. Objective-C 是动态语言

    Objective-C 的动态性是由 runtime 相关的库赋予的. 当然其他语言也完全可以运行在一个 Runtime 库上而获得动态性,由于多数高级语言的诞生都对应着一种编译器,因此将编译器的特性 ...

  8. Java入门第38课——猜字母游戏之设计程序结构

    问题        本案例需要实现猜字母游戏程序中的程序结构 方案        分析猜字母游戏可以看出,程序首先需要随机产生5个不同的字母作为需要猜测的结果,因此,可以先定义一个方法,以实现此功能: ...

  9. tomcat添加访问的ip限制

    在如下位置添加如下代码: 代码: <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow=&q ...

  10. Less功能特性

    (1)变量 我们常常在 CSS 中 看到同一个值重复多次,这样难易于代码维护 const bgColor="skyblue"; $(".post-content" ...