题目

有一个 \(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 染色的更多相关文章

  1. 树形DP 洛谷P2014 选课

    洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...

  2. 洛谷——P3914 染色计数

    P3914 染色计数 题目描述 有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号.你要给它染色,使得相邻节点的颜色不同.有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号 ...

  3. 洛谷 P3914 染色计数

    P3914 染色计数 题目描述 有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号.你要给它染色,使得相邻节点的颜色不同.有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号 ...

  4. 区间DP 洛谷P2858牛奶零食

    题目链接 题意:你有n个货物从1-n依次排列,每天可以从两侧选一个出来卖,卖的价格是当天的天数乘该货物的初始价格,问这批货物卖完的最大价格 输入:第一行n,之后是n个货物的初始价值 这道题不能用贪心做 ...

  5. P1279 字串距离 dp 洛谷

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...

  6. dp 洛谷P1977 出租车拼车 线性dp

    题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人 坐车去,还是一堆人一起,总共需要支付的钱 ...

  7. 洛谷P2486 染色

    LCT的一种姿势. 题意:给定一棵树.每次把一条路径上的点染成一种颜色,求一条路径上有多少段颜色. 解: 首先可以很轻易的用树剖解决,只不过代码量让人望而却步... 有一种难以想象的LCT做法... ...

  8. 经典DP 洛谷p1880 石子合并

    https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...

  9. [DP]洛谷P1115最大子段和

    题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一 ...

  10. 尼克的任务 dp 洛谷1280

    蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,, 首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始 ...

随机推荐

  1. C++ STL学习

    C++ STL学习 目录 C++ STL学习 容器库概览 对可以保存在容器中的元素的限制 容器支持的操作 所有容器都支持的操作或容器成员 迭代器 迭代器的公共操作 迭代器的类型 迭代器的const属性 ...

  2. 【Android逆向】破解看雪9月算法破解第二题

    1. apk安装到手机,一样的界面,随便输入一样的报错 2. apk拖入到jadx重看看 public native String sha1(String str); static { System. ...

  3. 【Android逆向】滚动的天空中插入smali日志

    1. 编写一个MyLog.java 放到一个android工程下,编译打包,然后反编译拿到MyLog的smali代码 package com.example.logapplication; impor ...

  4. django中信号

    # 信号的理解 在某个行为进行的某个阶段给这个行为添加一个附带的行为 # 相关api ## 数据表 pre_init # django的model执行其构造方法前,自动触发 post_init # d ...

  5. SwitUI初次体验

    序言 开年的第一篇文章,今天分享的是SwiftUI,SwiftUI出来好几年,之前一直没学习,所以现在才开始:如果大家还留在 iOS 开发,这们语言也是一个趋势: 目前待业中.... 不得不说已逝的2 ...

  6. 【Azure Developer】使用Azure Resource Graph的查询语法的示例

    文章"[Azure Developer]在Azure Resource Graph Explorer中查看当前订阅下的所有资源信息列表并导出(如VM的名称,IP地址内网/公网,OS,区域等) ...

  7. Java //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl

    1 //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl 2 int i =1; 3 for(i = 1; i<=150;i++) 4 { 5 System. ...

  8. 修改html5 placeholder文字默认颜色

    注意: 1.input后面的冒号不要写错! 2.-moz后面是没有input字样,火狐设置字体颜色为#000,但是他不是全黑,好像有个度似的!(个人认为) input:-ms-input-placeh ...

  9. 关于Chrome版本太旧的更新问题

    •问题 这两天不知道咋了,Chrome 老是给我提示版本太旧,需要更新. 作为一名资深的强迫症患者,这让我很是不爽. •解决方案 在桌面找到 Chrome 图标,右击选择[属性],在该位置添加如下语句 ...

  10. C++左值右值完美转发转移

    左值(Lvalue)与右值(Rvalue) 英文含义: 左值(Lvalue):Locator value,意味着它指向一个具体的内存位置. 右值(Rvalue):Read value,指的是可以读取的 ...