#线性dp,排列组合#洛谷 2476 [SCOI2008]着色方案
分析(弱化版)
最暴力的想法就是直接维护每种颜色的个数dp,
弱化版有一个很突出的地方就是 \(c_i\leq 5\),
也就是说可以将相同个数的颜色合并按照个数dp,
设 \(dp[c1][c2][c3][c4][c5][las]\) 表示个数为 \(i\) 的颜色有 \(ci\) 种,并且上一次选了个数为 \(las\) 的颜色的方案数
也就是这次如果选了 \(las-1\) 要减掉一个相邻的情况,转移可以记忆化。
代码
#include <cstdio>
using namespace std;
const int N=16,mod=1000000007;
int n,c[5],dp[N][N][N][N][N][5],ans;
int mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int Dp(int c0,int c1,int c2,int c3,int c4,int las){
if (dp[c0][c1][c2][c3][c4][las]) return dp[c0][c1][c2][c3][c4][las];
int ans=0;
if (c0) ans=mo(ans,1ll*(c0-(las==1))*Dp(c0-1,c1,c2,c3,c4,0)%mod);
if (c1) ans=mo(ans,1ll*(c1-(las==2))*Dp(c0+1,c1-1,c2,c3,c4,1)%mod);
if (c2) ans=mo(ans,1ll*(c2-(las==3))*Dp(c0,c1+1,c2-1,c3,c4,2)%mod);
if (c3) ans=mo(ans,1ll*(c3-(las==4))*Dp(c0,c1,c2+1,c3-1,c4,3)%mod);
if (c4) ans=mo(ans,1ll*(c4-(las==5))*Dp(c0,c1,c2,c3+1,c4-1,4)%mod);
return dp[c0][c1][c2][c3][c4][las]=ans;
}
int main(){
scanf("%d",&n);
for (int i=1,x;i<=n;++i)
scanf("%d",&x),++c[x-1];
for (int i=0;i<5;++i) dp[0][0][0][0][0][i]=1;
if (c[0]) ans=mo(ans,1ll*c[0]*Dp(c[0]-1,c[1],c[2],c[3],c[4],0)%mod);
if (c[1]) ans=mo(ans,1ll*c[1]*Dp(c[0]+1,c[1]-1,c[2],c[3],c[4],1)%mod);
if (c[2]) ans=mo(ans,1ll*c[2]*Dp(c[0],c[1]+1,c[2]-1,c[3],c[4],2)%mod);
if (c[3]) ans=mo(ans,1ll*c[3]*Dp(c[0],c[1],c[2]+1,c[3]-1,c[4],3)%mod);
if (c[4]) ans=mo(ans,1ll*c[4]*Dp(c[0],c[1],c[2],c[3]+1,c[4]-1,4)%mod);
return !printf("%d",ans);
}
分析(加强版)
在牛客的题目里,\(k,c_i\leq 30\),似乎有点棘手,考虑一个一个颜色填入序列。
设 \(dp[i][j]\) 表示前 \(i\) 种颜色有 \(j\) 个相邻的同色块的方案数。
枚举将这种颜色分成 \(k\) 段,以及选择 \(o\) 段破坏原来的相邻的同色块。那么
\]
代码
#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
const int N=31,M=911,mod=1000000007;
int a[N],s[N],c[M][M],dp[N][M],n;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int main(){
c[0][0]=1;
for (int i=1;i<M;++i){
c[i][0]=c[i][i]=1;
for (int j=1;j<i;++j)
c[i][j]=mo(c[i-1][j-1],c[i-1][j]);
}
for (int T=iut();T;--T){
n=iut();
for (int i=1;i<=n;++i) a[i]=iut(),s[i]=s[i-1]+a[i];
memset(dp,0,sizeof(dp)),dp[1][a[1]-1]=1;
for (int i=2;i<=n;++i)
for (int j=0;j<=s[i-1];++j)
if (dp[i-1][j]){
for (int k=1;k<=a[i];++k) for (int o=0;o<=k&&o<=j;++o)
dp[i][j+a[i]-k-o]=mo(dp[i][j+a[i]-k-o],1ll*dp[i-1][j]*c[a[i]-1][k-1]%mod*c[s[i-1]+1-j][k-o]%mod*c[j][o]%mod);
}
printf("%d\n",dp[n][0]);
}
return 0;
}
#线性dp,排列组合#洛谷 2476 [SCOI2008]着色方案的更多相关文章
- BZOJ1079或洛谷2476 [SCOI2008]着色方案
一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...
- 洛谷 2476 [SCOI2008]着色方案
50%的数据满足:1 <= k <= 5, 1 <= ci <= 3 100%的数据满足:1 <= k <= 15, 1 <= ci <= 5 [题解] ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
- bzoj 1079: [SCOI2008]着色方案 DP
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 803 Solved: 512[Submit][Status ...
- [SCOI2008] 着色方案[高维dp]
321. [SCOI2008] 着色方案 ★★★ 输入文件:color.in 输出文件:color.out 简单对比时间限制:1 s 内存限制:64 MB 题目背景: 有n个木块排成一 ...
- BZOJ 1079: [SCOI2008]着色方案 记忆化搜索
1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
随机推荐
- stat模块
# stat模块定义了常数和函数,并用这些来解释os.stat().os.fstat()和os.lstat()的结果(如果这些在该平台上存在的话). stat.S_ISREG(mode) # 判断mo ...
- Ubuntu下docker部署
使用docker进行容器化集成部署 远程服务器更新源 更新ubuntu的apt源 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo dpkg --configu ...
- 【LeetCode链表#11】环形链表II(双指针)
环形链表II 力扣题目链接(opens new window) 题意: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,使用整数 pos 来表示 ...
- PMP考试计算题汇总
第6章 项目时间管理 本节术语较多.涉及的工具&技术也不少. 主要包括活动定义.活动排序.活动资源估算.活动历时估算.进度制定.进度控制6个子过程. 1.1活动定义:就是对WBS的进一步分解. ...
- com.fasterxml.jackson.databind.exc.InvalidDefinitionException
@JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响. 写法将此标签加在model 类的类名上 ,可以多个 ...
- 【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
问题描述 需要在APIM策略中对请求所携带的Cookie中的token值进行JWT验证,如果获取Cookie中的值并且作为变量保存,然后在JWT 验证中使用呢? 问题解答 第一步:获取Cookie中的 ...
- 【Azure 环境】标准版 Logic App 如何查看 Workflow的执行成功数和失败数的指标呢?
问题描述 在Azure中创建逻辑应用(Logic App),有两种计划类型.一是消费型,另一种是标准型. 在消费型的Logic App Metrics页面中,我们可以看见Workflow的执行成功数指 ...
- 【Azure 微服务】Azure Service Fabric 因证书问题而使得 Node 一直处于 Down 状态
问题描述 Service Fabric 集群更新证书后,重启Node后就变为Down的状态,反复 Restart 结果反复Down 问题分析 根据Service Fabric的文档表示,修改证书时一定 ...
- 英语自定义标签 <i:juzi><i:zhuyu>John Smith</i:zhuyu></i:juzi> 主语谓语宾语
效果 John Smith died in World War Two. John Smith killed three enemy soldiers. <style> i\:juzi { ...
- STM32 SPI接口 DMA normal 和circual区别
DMA有normal和circular两种模式. circular模式: 就调用这个函数一次就可以了,DMA一直开启,一帧数据发送完毕之后里面发送下一帧,中间没有停顿.这样确实是快了,也释放了CPU, ...