一本通5.4练习1:涂抹果酱
题目描述
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:涂抹果酱相关推荐
- #10172. 「一本通 5.4 练习 1」涂抹果酱 题解
题目链接 一道三进制状压的好题. 题目描述: Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M的矩形,它被划分成 N×M个边长为 1×1的小正方形区域(可以把 ...
- 一本通1594涂抹果酱
1594:涂抹果酱 时间限制: 1000 ms 内存限制: 524288 KB [题目描述] Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M ...
- 【算法•日更•第十五期】信息奥赛一本通1594:涂抹果酱题解
废话不多说,直接上题: 1594:涂抹果酱 时间限制: 1000 ms 内存限制: 524288 KB 提交数: 146 通过数: 46 [题目描述] Tyvj 两周年庆典要到 ...
- #10172. 「一本通 5.4 练习 1」涂抹果酱 【 三进制状态压缩 】【 方案数 】
Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM 列的矩阵) ...
- LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱
题目链接:https://loj.ac/problem/10172 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×MN×MN×M 的矩形,它被划分成 ...
- LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱
题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M 的矩形,它被划分成 N×M 个边长为 1×1 的小正方形区域(可以把蛋糕当成 NNN 行 MMM ...
- 涂抹果酱_如何玩果酱
涂抹果酱 在2017年All Things Open大会上 ,我和Michael Clayton进行了关于游戏果酱和开源开发工具的演讲. 这是我们演示文稿的概述. 首先,有很多原因使开发人员喜欢创建游 ...
- 涂抹果酱_2015年全球游戏果酱
涂抹果酱 It's that time of the year again! Global Game Jam is on next weekend! Unity Pro trial licenses ...
- 三进制状压动态规划【涂抹果酱】 题解
前言:好不容易搞懂了这道题,感觉网上能找到的题解在我有疑问的地方都讲的不是很细,所以我来写一篇吧. 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M ...
最新文章
- javascript 异步实现方案
- 「面试题」介绍你做过最复杂的系统
- 成功解决type object ‘h5py.h5.H5PYConfig‘ has no attribute ‘__reduce_cython__‘
- 三维重建2: 地图构建-三角测量
- IDOC generation debug for One Order
- 超值爆赞丨Java 程序员推荐的学习教程,刷爆了朋友圈...
- 常见的目标检测中的背景建模方法总结
- 苹果汽车真是全自动驾驶?分析师称不要指望有方向盘
- SSM配置后可以访问静态html文件但无法访问其他后台接口的解决方案
- Dummary、Fake、Stub、Spy、Mock
- 亚信科技java笔试题答案_亚信科技java面试题及答案.doc
- 气象统计 第八次实习 EOF分析
- 华为路由器交换机配置命令集合
- golang六个常用的web 框架
- MOS管参数每一个参数详解-收藏版
- 商家自研美团闪购开放平台SDK对接
- 树型结构总结:二叉查找树、堆、平衡树、2-3查找树、红黑树、B树、B+树
- 如何查看一个vs工程使用的vs版本是哪一个?
- 使用Simu5G实现车联网V2X通信过程(两个简单的示例)
- java模拟器环境_Win10 + Appium+夜神/MuMu模拟器环境搭建
热门文章
- 场景拆解六步设计法,手把手教你细化场景
- commit在c语言中的作用,【单选题】SQL语 言 中 COMMIT语句的主要作用是( )
A. 结束程序 B. 返回系统 C. 存储数据 D. 提交事务...
- python爬取网页表格数据匹配_爬取表格类网站数据并保存为excel文件
- DM6467的CAN模块调试(SPI转CAN)
- ffmpeg代码实现往视频文件里面叠加文字
- 本科就学人工智能有意义吗?
- JS第二次授课及字节跳动2017秋招前端工程师笔试试卷涉及知识点
- matlab短时过零率计算+源代码
- PTA数据库题目集第一章
- 抖音运营技巧都有哪些?如何让爆粉?