题目链接:https://loj.ac/problem/10172

题目描述

Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕。蛋糕俯视图是一个 N×MN×MN×M 的矩形,它被划分成 N×MN×MN×M 个边长为 1×11×11×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵)。蛋糕很快做好了,但光秃秃的蛋糕肯定不好看!所以,Sam 要在蛋糕的上表面涂抹果酱。果酱有三种,分别是红果酱、绿果酱、蓝果酱,三种果酱的编号分别为 1,2,31,2,31,2,3。为了保证蛋糕的视觉效果,Admin 下达了死命令:相邻的区域严禁使用同种果酱。但 Sam 在接到这条命令之前,已经涂好了蛋糕第 KKK 行的果酱,且无法修改。
现在 Sam 想知道:能令 Admin 满意的涂果酱方案有多少种。请输出方案数  mod 106\bmod 10^6mod106。若不存在满足条件的方案,请输出 000。

输入格式

输入共三行。
第一行:N,MN, MN,M;
第二行:KKK;
第三行:MMM 个整数,表示第 KKK 行的方案。
字母的详细含义见题目描述,其他参见样例。

输出格式

输出仅一行,为可行的方案总数。

样例

样例输入

2 2
1
2 3

样例输出

3

样例说明

方案一 方案二 方案三
2 3\texttt{2 3}2 3 
1 2\texttt{1 2}1 2
2 3\texttt{2 3}2 3 
3 1\texttt{3 1}3 1
2 3\texttt{2 3}2 3 
3 2\texttt{3 2}3 2

数据范围与提示

对于 30% 的数据,1≤N×M≤201≤N×M≤201≤N×M≤20;
对于 60% 的数据,1≤N≤1000,1≤M≤31≤N≤1000,1≤M≤31≤N≤1000,1≤M≤3;
对于 100% 的数据,1≤N≤10000,1≤M≤51≤N≤10000,1≤M≤51≤N≤10000,1≤M≤5。

题解

在网上找的题解,都不太清楚,让本蒟蒻卡了一下午加一晚上。

所以我弄懂以后,我就自己写了一篇,希望大家喜欢!

这道题是一道很好的状态压缩dp,因为有三种颜色,所以不能压成二进制,只能压成三进制。

当然啦,状压dp是基本一定要初始化的,别问我怎么知道的。

我们考虑以下两个初始化(就是代码里的pd1,pd2)

1. 每一行总共有很多种,但是因为相同颜色的果酱不能放在相邻的位置,所以每一行的不可行状态有很多。

这就需要预处理出一行中的可行状态。这样的话我们的dp数量会大大减少。

3. 预处理行与行之间的判断

跟预处理类似,减去不合法状态。

然后,就是我们的dp了。

其实这题很好想,dp[i][j]表示第i行的第j种状态,最后取个摸就行了。

方程:dp[i][j]+=dp[i-1][k]

最后的最后,大力推荐一下我的读入优化,跑的是真滴快!

#define num ch-'0'
inline void get(int &res)
{
char ch;bool flag=;
while(!isdigit(ch=getchar()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getchar());res=res*+num);
(flag)&&(res=-res);
}

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define MAXN 10010
#define mod 1000000
#define num ch-'0'
using namespace std;
inline int MAX(int a,int b){return a>b?a:b;}
inline int MIN(int a,int b){return a<b?a:b;}
inline void get(int &res)
{
char ch;bool flag=;
while(!isdigit(ch=getchar()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getchar());res=res*+num);
(flag)&&(res=-res);
}
int n,g,m,k;
int dp[MAXN][],ok[][];
int a[],c[],t;
inline int pd1(int x)
{
for(register int i=m-;i;--i)if((x%c[i+])/c[i]==(x%c[i])/c[i-]) return ;
return ;
}
inline int pd2(int x,int y)
{
for(register int i=m-;i>=;--i) if((x%c[i+])/c[i]==(y%c[i+])/c[i]) return ;
return ;
}
int main()
{
get(n),get(m),get(k);
c[]=;
int num1=;
for(register int i=;i<=m;++i)
{
get(g);
num1=num1*+(g-);
c[i]=c[i-]*;
}
if(!pd1(num1)) {puts("");return ;}
for(register int i=;i<c[m];++i)
{
if(pd1(i)) a[++t]=i;
if(num1==i) dp[][t]=;
}
for(register int i=;i<=t;++i)
for(register int j=;j<=t;++j)
ok[i][j]=pd2(a[i],a[j]);
int res1=,res2=;
int x=MIN(n-k,k-),y=MAX(n-k,k-);
for(register int i=;i<=y;++i)
for(register int j=;j<=t;++j)
for(register int k=;k<=t;++k)
if(ok[k][j])
(dp[i][j]+=dp[i-][k])%=mod;
for(register int i=;i<=t;++i)
{
res1=(res1+dp[x][i])%mod;
res2=(res2+dp[y][i])%mod;
}
printf("%lld",((long long)res2*res1)%mod);
}

LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱的更多相关文章

  1. LOJ#10117. 「一本通 4.1 练习 2」简单题

    LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...

  2. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  3. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  4. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  5. LOJ #10084. 「一本通 3.3 练习 1」最小圈(二分+SPFA判负环)

    题意描述: 见原LOJ:https://loj.ac/problem/10084 题解: 假设所求的平均最小值为X,环上各个边的权值分别为A1,A2...Ak,可以得到: X=(A1+A2+A3+.. ...

  6. LOJ #10132. 「一本通 4.4 例 3」异象石

    题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...

  7. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...

  8. LOJ#10065. 「一本通 3.1 例 2」北极通讯网络

    题目链接:https://loj.ac/problem/10065 题目描述 原题来自:Waterloo University 2002 北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 ( ...

  9. LOJ#10106. 「一本通 3.7 例 2」单词游戏

    题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...

随机推荐

  1. HTML注册页面验证注册信息

    在这里主要介绍两种验证方式,一种是点击注册按钮后会提示最上方的出错位置,弹出窗口提示格式不对.另一种是利用鼠标事件,在鼠标进行不同操作时会有不同的click事件. 这两种都是利用javascript, ...

  2. 转:oracle几组重要的常见视图-v$latch,v$latch_children,v$lock,v$locked_object

    v$latch Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串行化锁定机制.Latch的实现是与操作系统相关的, 尤 ...

  3. IDA Pro 权威指南学习笔记(三) - IDA 桌面简介

    IDA 的默认桌面如下图 工具栏区域(1)包含与 IDA 的常用操作对应的工具,可以使用 View -> Toolbar 显示或隐藏工具栏 可以使用 View -> Toolbars -& ...

  4. Deep Learning 学习笔记(2):多参数的线性回归

    上次用简单地介绍了线性回归的模型和梯度下降获得参数方程的方法. 用到的一个十分简单的参数方程h(x)=theta0+theta1*x 在现实问题中,参数方程能要复杂许多, 不只有一个未知量x,可能有多 ...

  5. krpano之字幕添加

    字幕是指介绍语音的字幕,字幕随着语音的播放而滚动,随语音暂停而暂停.字幕添加的前提是用之前的方法添加过介绍语音. 原理: 字幕层在溢出隐藏的父元素中向右滑动,当点击声音控制按钮时,字幕位置被固定,再次 ...

  6. python:if 语句的使用方法

    if-else类型: #if-else num = int(input("输入成绩!")) if num > 60: print ("及格") else: ...

  7. 解决mybatis中转义字符的问题

    xml格式中不允许出现类似“>”这样的字符,有如下两种解决方法 方法一:使用转义字符 SELECT * FROM test WHERE 1 = 1 AND start_date <= CU ...

  8. NFA/DFA算法

    1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时 ...

  9. 【HDU4303】Hourai Jeweled

    题意 有一棵n个结点的树,每个结点都有一个值,没一条边都有一个颜色.如果某条路径上,相邻的边颜色不同,那么把这路径上所有的点的值加起来. 输出所有符合条件的路径上值的和. n<=300000. ...

  10. 刷题向》POJ2823 单调队列裸题(<不会做,请自裁>系列)

    最近BZOJ炸了,而我的博客上又更新了一些基本知识,所以这里刷一些裸题,用以丰富知识性博客 POJ2823   滑动的窗口 这是一道经典的单调队题,我记得我刚学的时候就是用这道题作为单调队列的例题,算 ...