#线性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 ...
随机推荐
- win32 - wsprintfW的使用
文档:将格式化的数据写入指定的缓冲区.根据格式字符串中相应的格式说明,将转换任何参数并将其复制到输出缓冲区.该函数在其写入的字符后附加一个终止空字符,但返回值的字符计数中不包含终止空字符. 例子: # ...
- 【Azure 事件中心】关闭或开启Azure Event Hub SDK中的日志输出
问题描述 使用Azure Event Hub的Java SDK 作为消费端消费消息,集成在项目中后,发现大量日志产生,并且都是Debug 级别日志,如何来关闭这部分日志输出呢? import com. ...
- Codeforces Round 928 (Div. 4)(A、B、C、D、E、G)
目录 A B C D E G A 统计A.B输出 #include <bits/stdc++.h> #define int long long #define rep(i,a,b) for ...
- Mac根目录下无法创建文件或目录
无法创建目录 最近小伙伴经常反馈Mac根目录下创建文件或目录一直失败,并且尝试了各种姿势. 常见错误如下: # 常见错误1, 直接创建目录 mkdir -p /test mkdir: /data: R ...
- 使用PdfSharp从模板生成Pdf文件
最近在做一个生成文档的需求.通过先制作一个包含各字段占位符的文档模板,导入这个模板并填写内容替换掉占位符,再输出成最终文件. 由于版式固定,安全性更好,业务上常用Pdf作为最终标准化的格式, 在. ...
- 协议CAN&报文&仲裁
简介 物理层 CAN 协议提供了 5 种帧格式来传输数据 数据链路层 中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID) 显性0,隐性1 ...
- 计算引擎-Presto
概述 参考 高质量: B站:https://mp.weixin.qq.com/s/9_lSIFSw5o8sFC8foEtA7w https://mp.weixin.qq.com/s/NmTaJjE0U ...
- 生成文件名为系统时间的C源码实例
一 最近遇到了一个需要根据时间记录文件名的.先写一个实例来实战: #include<stdlib.h> #include<time.h> #include<stdio.h ...
- 文件的特殊权限:SUID,SGID,SBIT
文件的特殊权限:SUID,SGID,SBIT Set UID SUID权限只用于二进制文件 运行者必须有X权限 运行者在程序运行过程(run-time)中具有二进制文件拥有者(owner)的权限 例子 ...
- 视野修炼第71期 | Rspack 家族新成员 Rsdoctor
欢迎来到第 71 期的[视野修炼 - 技术周刊],下面是本期的精选内容简 强烈推荐 Rspack 新成员:Rsdoctor Bun Shell DCloud:App跨平台框架对比2023版 开源工具& ...