#轮廓线dp#洛谷 2435 染色
题目
有一个 \(n\) 行 \(m\) 列的格点图,你需要给每个点上染上 \(k\) 种颜色中的一种,
要求没有两个相邻点颜色相同。给定第一行与最后一行的染色,试求总染色方案数。
分析
首先对于 \(k=2\) 要特判,因为存在 \(m\) 特别大的情况,
否则可以将每种颜色压成二位二进制,直接状压会TLE,
设 \(dp[n][m][S]\) 表示处理到 \((n,m)\) 轮廓线颜色状态为 \(S\)的方案数,
还是分第一个格子和其它格子判断,注意 \(k=3\) 时颜色 3 不能选择。
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=65536,mod=376544743; bool bbc[N<<1];
int n,m,k,two[16],f[N],dp[N],al,S;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
n=iut(),m=iut(),k=iut();
if (k==2){
for (rr int i=0;i<m;++i) bbc[i]=iut();
for (rr int i=0;i<m;++i)
if (bbc[i]^iut()^(n&1)^1) return !putchar(48);
return !putchar(49);
}
two[0]=1;
for (rr int i=1;i<2*m;++i)
two[i]=two[i-1]<<1;
for (rr int i=0;i<m;++i){
rr int x=iut();
if (x&1) S|=two[i<<1];
if (x&2) S|=two[i<<1|1];
}
dp[S]=1,al=1<<(m*2);
for (rr int i=1;i<n;++i){
memset(f,0,sizeof(int)*al);
for (rr int j=0;j<al;++j){
if ((j&3)==3&&k==3) continue;
for (rr int t=0;t<k;++t)
if ((j&3)!=t)
f[j]=mo(f[j],dp[j^(j&3)^t]);
}
memcpy(dp,f,sizeof(int)*al);
for (rr int o=1;o<m;++o){
memset(f,0,sizeof(int)*al);
for (rr int j=0;j<al;++j){
rr int F=j&(two[o*2-2]|two[o*2-1]);
rr int now=j&(two[o<<1]|two[o<<1|1]);
if (now==F*4) continue;
if (now==(two[o<<1]|two[o<<1|1])&&k==3) continue;
for (rr int t=0;t<k;++t)
if (now!=t*two[o<<1])
f[j]=mo(f[j],dp[j^now^(t*two[o<<1])]);
}
memcpy(dp,f,sizeof(int)*al);
}
}
S=0;
for (rr int i=0;i<m;++i){
rr int x=iut();
if (x&1) S|=two[i<<1];
if (x&2) S|=two[i<<1|1];
}
return !printf("%d",dp[S]);
}
#轮廓线dp#洛谷 2435 染色的更多相关文章
- 树形DP 洛谷P2014 选课
洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...
- 洛谷——P3914 染色计数
P3914 染色计数 题目描述 有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号.你要给它染色,使得相邻节点的颜色不同.有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号 ...
- 洛谷 P3914 染色计数
P3914 染色计数 题目描述 有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号.你要给它染色,使得相邻节点的颜色不同.有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号 ...
- 区间DP 洛谷P2858牛奶零食
题目链接 题意:你有n个货物从1-n依次排列,每天可以从两侧选一个出来卖,卖的价格是当天的天数乘该货物的初始价格,问这批货物卖完的最大价格 输入:第一行n,之后是n个货物的初始价值 这道题不能用贪心做 ...
- P1279 字串距离 dp 洛谷
题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...
- dp 洛谷P1977 出租车拼车 线性dp
题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人 坐车去,还是一堆人一起,总共需要支付的钱 ...
- 洛谷P2486 染色
LCT的一种姿势. 题意:给定一棵树.每次把一条路径上的点染成一种颜色,求一条路径上有多少段颜色. 解: 首先可以很轻易的用树剖解决,只不过代码量让人望而却步... 有一种难以想象的LCT做法... ...
- 经典DP 洛谷p1880 石子合并
https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...
- [DP]洛谷P1115最大子段和
题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一 ...
- 尼克的任务 dp 洛谷1280
蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,, 首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始 ...
随机推荐
- win32 - IFolderView2::GetCurrentFolderFlags的使用
网上关于IFolderView2接口调用的示例有点少. 下面的例子是将桌面的图标隐藏起来,使用了FWF_NOICONS样式. #include <ShlObj.h> // Shell AP ...
- swagger 文档优化 knife4j 增强 Swagger
swagger 省去了程序员开发过程中拟写接口文档的时间,是团队开发必不可少的工具,原生的swagger 界面功能比较少,也不支持文档导出,业界也有不少针对swagger 文档界面优化的插件,良莠不齐 ...
- 类型判断,代码块,流程控制及循环---day05
1.类型判断isinstance 用来做判断类型 语法: 用法一: isinstance(要判断的值,要判断的类型) 返回的是真或者假 用法二: isinstance(要判断的值,(可能的类型))如果 ...
- ABP的版本升级,从7.2.2升级到7.2.3
1.升级ABP CLI 见前面的文章:ABP开发需要用到的命令 更新最新版本: ~~~ dotnet tool update -g Volo.Abp.Cli ~~~ 2.升级ABP Suite 见前面 ...
- yolo7检测学习Bubbliiiing的视频有感——(1)no model named 'cv2'
我一直以来也是喜欢用vscode,就跟随B导安装了vscode 下载完B导提供的代码后如果想直接跟着视频B导的操作运行predict.py文件是不可能的,需要按照readme文档中的所有提示按照步骤放 ...
- 小程序开发:app.vue检测更新时判断是否是朋友圈进入
因为如果从朋友圈点进小程序来的,有些功能就用不了,所以需要判断下是否从朋友圈点进来的. 检查代码如下: checkScene() { // 判断场景值 如果是从分享到朋友圈再打开 就会有一些功能无法使 ...
- apt-get upgrade 和apt-get dist-upgrade区别
kali linux系统或者 debian等系统 以及centos 在系统升级后经常会出现系统无法启动,或者启动之后GUI功能没有的问题: 笔记: 区别这两种用法 apt-get update ...
- Java面向对象(下)--static/final/代码块/抽象/接口/内部类
目录 1 关键字:static 2 理解main方法的语法 3 类的成员之四:代码块 4关键字:final 5 抽象类与抽象方法 6 接口(interface) 7 类的成员之五:内部类 static ...
- Android 设置任意View的背景为圆形或圆角
原文地址: Android 设置任意View的背景为圆形或圆角 - Stars-One的杂货小窝 我的需求主要还是在SurfaceView需要设置为圆形背景,在网上找了下,发现一个可行方法,做个记录 ...
- Java Spring Redis 如何向Set中添加List?
调用list.toArray方法将list转成数组,再使用add方法参数传入数组,即可批量添加. redisTemplate.opsForSet().add(key,collect.toArray(n ...