题目描述

Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕。蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M个边长为 1×1 的小正方形区域(可以把蛋糕当成 N行M列的矩阵)。蛋糕很快做好了,但光秃秃的蛋糕肯定不好看!所以,Sam 要在蛋糕的上表面涂抹果酱。果酱有三种,分别是红果酱、绿果酱、蓝果酱,三种果酱的编号分别为 1,2,3。为了保证蛋糕的视觉效果,Admin 下达了死命令:相邻的区域严禁使用同种果酱。但 Sam 在接到这条命令之前,已经涂好了蛋糕第 K 行的果酱,且无法修改。

现在 Sam 想知道:能令 Admin 满意的涂果酱方案有多少种。请输出方案数 mod 10^6。若不存在满足条件的方案,请输出 0。

输入格式

输入共三行。

第一行:N,M;

第二行:K;

第三行:M 个整数,表示第 K 行的方案。

字母的详细含义见题目描述,其他参见样例。

输出格式

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

样例输入

2 2
1
2 3

样例输出

3

样例解释

方案一 方案二 方案三
2 3 2 3 2 3
1 2 3 1 3 2

数据范围与提示

对于 30% 的数据,1≤N×M≤20;

对于 60% 的数据,1≤N≤1000,1≤M≤3;

对于 100% 的数据,1≤N≤10000,1≤M≤5。

题解

本题的数据透露了本题的做法——状态压缩dp。但一般的状压dp都是通过二进制数来记录每个单元的0-1的状态(即能不能,选不选等),但本题涉及到三个3种状态,显然无法通过传统的二进制位运算进行状态压缩。故而,我们想到将其转化为一个类似于三进制的数的形式来压缩状态。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define int long long
int state[300],dp[10003][300],s1,g;
int n,m,k,cnt=0,s2;
int const mod=1e6;
inline bool check(int a,int b){//判断两个状态能否作为相邻的两行if(a==b)return 0;while(a){if(a%10==b%10)return 0;a/=10;b/=10;}return 1;
}
signed main(){cin>>n>>m;for(int i=1;i<=m;i++)g=g*10+3;//预处理最大情况cin>>k;for(int i=1;i<=m;++i){int x;cin>>x;if(s1%10==x)s2=1;//判断的k行的状态是否合法s1=s1*10+x;}if(s2){cout<<0;return 0;}for(int i=pow(10,m-1);i<=g;i++){//寻找所有可能合法的状态,即相邻两数都不相等的状态int flag=1,x=i,p;while(x){p=x%10;x=x/10;if(p==x%10)flag=0;if(p==0||p>3)flag=0;}if(flag)state[++cnt]=i;if(i==s1)s2=cnt;//找到第k行状态所对应的编号}if(k==1)dp[1][s2]=1;else{for(int i=1;i<=cnt;i++)dp[1][i]=1;}for(int i=2;i<=n;i++){if(i!=k){for(int k1=1;k1<=cnt;k1++){//枚举前一行的状态for(int k2=1;k2<=cnt;k2++){//枚举当前行的状态if(check(state[k1],state[k2]))dp[i][k2]=(dp[i][k2]+dp[i-1][k1])%mod;}}}else{for(int k=1;k<=cnt;k++){if(check(s1,state[k]))dp[i][s2]=(dp[i-1][k]+dp[i][s2])%mod;}}}int ans=0;for(int i=1;i<=cnt;i++){ans=(ans+dp[n][i])%mod;}cout<<ans;return 0;
}

一本通5.4练习1:涂抹果酱相关推荐

  1. #10172. 「一本通 5.4 练习 1」涂抹果酱 题解

    题目链接 一道三进制状压的好题. 题目描述: Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M的矩形,它被划分成 N×M个边长为 1×1的小正方形区域(可以把 ...

  2. 一本通1594涂抹果酱

    1594:涂抹果酱 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M ...

  3. 【算法•日更•第十五期】信息奥赛一本通1594:涂抹果酱题解

    废话不多说,直接上题: 1594:涂抹果酱 时间限制: 1000 ms         内存限制: 524288 KB 提交数: 146     通过数: 46 [题目描述] Tyvj 两周年庆典要到 ...

  4. #10172. 「一本通 5.4 练习 1」涂抹果酱 【 三进制状态压缩 】【 方案数 】

    Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵) ...

  5. LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱

    题目链接:https://loj.ac/problem/10172 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×MN×MN×M 的矩形,它被划分成 ...

  6. LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱

    题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM  ...

  7. 涂抹果酱_如何玩果酱

    涂抹果酱 在2017年All Things Open大会上 ,我和Michael Clayton进行了关于游戏果酱和开源开发工具的演讲. 这是我们演示文稿的概述. 首先,有很多原因使开发人员喜欢创建游 ...

  8. 涂抹果酱_2015年全球游戏果酱

    涂抹果酱 It's that time of the year again! Global Game Jam is on next weekend! Unity Pro trial licenses ...

  9. 三进制状压动态规划【涂抹果酱】 题解

    前言:好不容易搞懂了这道题,感觉网上能找到的题解在我有疑问的地方都讲的不是很细,所以我来写一篇吧. 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M ...

最新文章

  1. javascript 异步实现方案
  2. 「面试题」介绍你做过最复杂的系统
  3. 成功解决type object ‘h5py.h5.H5PYConfig‘ has no attribute ‘__reduce_cython__‘
  4. 三维重建2: 地图构建-三角测量
  5. IDOC generation debug for One Order
  6. 超值爆赞丨Java 程序员推荐的学习教程,刷爆了朋友圈...
  7. 常见的目标检测中的背景建模方法总结
  8. 苹果汽车真是全自动驾驶?分析师称不要指望有方向盘
  9. SSM配置后可以访问静态html文件但无法访问其他后台接口的解决方案
  10. Dummary、Fake、Stub、Spy、Mock
  11. 亚信科技java笔试题答案_亚信科技java面试题及答案.doc
  12. 气象统计 第八次实习 EOF分析
  13. 华为路由器交换机配置命令集合
  14. golang六个常用的web 框架
  15. MOS管参数每一个参数详解-收藏版
  16. 商家自研美团闪购开放平台SDK对接
  17. 树型结构总结:二叉查找树、堆、平衡树、2-3查找树、红黑树、B树、B+树
  18. 如何查看一个vs工程使用的vs版本是哪一个?
  19. 使用Simu5G实现车联网V2X通信过程(两个简单的示例)
  20. java模拟器环境_Win10 + Appium+夜神/MuMu模拟器环境搭建

热门文章

  1. 场景拆解六步设计法,手把手教你细化场景
  2. commit在c语言中的作用,【单选题】SQL语 言 中 COMMIT语句的主要作用是( ) A. 结束程序 B. 返回系统 C. 存储数据 D. 提交事务...
  3. python爬取网页表格数据匹配_爬取表格类网站数据并保存为excel文件
  4. DM6467的CAN模块调试(SPI转CAN)
  5. ffmpeg代码实现往视频文件里面叠加文字
  6. 本科就学人工智能有意义吗?
  7. JS第二次授课及字节跳动2017秋招前端工程师笔试试卷涉及知识点
  8. matlab短时过零率计算+源代码
  9. PTA数据库题目集第一章
  10. 抖音运营技巧都有哪些?如何让爆粉?