#线性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 ...
随机推荐
- Unity学习笔记--数据持久化XML文件(1)
XML相关 Xml是可拓展标记语言,一种文件格式.我们使用xml来完成对数据持久化的存储.等待我们有一程序运行结束之后,将内存中的数据进行保存,(保存在硬盘/服务器)实现对数据的持久化存储. xml文 ...
- xcode真机运行包添加(更新到15.4)
今天给真机装包,提示xcode版本低不能安装,电脑内存有些不足,xcode更新不了,这时候了解到xcode可以单独添加开发包\(^o^)/~ 1.下载 链接: https://pan.baidu.co ...
- 树莓派开发笔记(十六):树莓派4B+安装mariadb数据库(mysql开源分支)并测试基本操作
前言 树莓派使用数据库时,优先选择sqlite数据库,但是sqlite是文件数据库同时仅针对于单用户的情况,考虑到多用户的情况,在树莓派上部署安装mariadb数据库服务(mysql的开源分支), ...
- python字符串模板文本处理之Template
from string import Template s = Template('$who 在 $do') ts = s.substitute(who="张三", do=&quo ...
- 【Azure Function】开启Azure Function输出详细Debug日志 ( --verbose)
When func.exe is run from VS, it suggests "For detailed output, run func with --verbose flag.&q ...
- 没想到,JDBC 驱动会偷偷修改 sql_mode 的会话值
最近碰到一个 case,值得分享一下. 现象就是一个 update 操作,在 mysql 客户端中执行提示 warning,但在 java 程序中执行却又报错. 问题重现 mysql> crea ...
- Java 练习题(类+调用方法)
1 /* 2 * 3 * 定义一个 PassObject,在类中定义一个方法printAress(),该方法的定义如下: 4 * public void printAreas(Circle c,int ...
- body标签下莫名奇妙多了一行空行,原来是编码的问题
之前为了方便,直接在服务器修改文件,然后点保存,但是问题来了,在顶部莫名奇妙多了一个空行,如图1 图1 原来在源代码编辑的代码如图2 图2 但是在FF或者Chrome外部样式却在body里面,而不是h ...
- Jenkins Pipeline:根据参数设置环境变量
pipeline { agent any environment { //以上自定义的参数 project = "$params.PROJECT" } stages { stage ...
- Java基础全程复习笔记(值得参考)
Java基础复习笔记 第01章:Java语言概述 1. Java基础学习的章节划分 第1阶段:Java基本语法 Java语言概述.Java的变量与进制.运算符.流程控制语句(条件判断.循环结构).br ...