一、Problem

8 间牢房排成一排,每间牢房不是有人住就是空着。每天,无论牢房是被占用或空置,都会根据以下规则进行更改:

如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用。
否则,它就会被空置。
(请注意,由于监狱中的牢房排成一行,所以行中的第一个和最后一个房间无法有两个相邻的房间。)

我们用以下方式描述监狱的当前状态:如果第 i 间牢房被占用,则 cell[i]==1,否则 cell[i]==0。

根据监狱的初始状态,在 N 天后返回监狱的状况(和上述 N 种变化)。

输入:cells = [0,1,0,1,1,0,0,1], N = 7
输出:[0,0,1,1,0,0,0,0]
解释:
下表概述了监狱每天的状况:
Day 0: [0, 1, 0, 1, 1, 0, 0, 1]
Day 1: [0, 1, 1, 0, 0, 0, 0, 0]
Day 2: [0, 0, 0, 0, 1, 1, 1, 0]
Day 3: [0, 1, 1, 0, 0, 1, 0, 0]
Day 4: [0, 0, 0, 0, 0, 1, 0, 0]
Day 5: [0, 1, 1, 1, 0, 1, 0, 0]
Day 6: [0, 0, 1, 0, 1, 1, 0, 0]
Day 7: [0, 0, 1, 1, 0, 0, 0, 0]示例 2:
输入:cells = [1,0,0,1,0,0,1,0], N = 1000000000
输出:[0,0,1,1,1,1,1,0]

提示:

cells.length == 8
cells[i] 的值为 0 或 1
1 <= N <= 10^9

二、Solution

方法一:状态压缩 + 循环节

N 很大,模拟会超时的,这种题要有解的话,一定存在循环节,这里用一个 map 存储状态与天数的映射

当某一个状态在 D1 出现过,且在后面的天数 D2 也出现了的话,就存在一个大小为 D1-D2 的循环节,D 可对循环节进行取模,进而缩小循环次数

class Solution {public:int nextState(int st) {int nst = 0;for (int i = 1; i <= 6; i++) {if (((st>>(i-1))&1) == ((st>>(i+1))&1))nst |= 1 << i;}return nst;}vector<int> prisonAfterNDays(vector<int>& A, int D) {int n = A.size(), st = 0; vector<int> ans(n, 0);unordered_map<int, int> m;for (int i = 0; i < n; i++) if (A[i])st |= (1 << i);while (D) {if (m.count(st))D %= m[st]-D;m[st] = D;if (D >= 1) D--, st = nextState(st);}for (int i = 0; i < n; i++) if ((st >> i) & 1) ans[i] = 1;return ans;}
};

复杂度分析

  • 时间复杂度:O(循环节大小)O(循环节大小)O(循环节大小),
  • 空间复杂度:O(n)O(n)O(n),

【思维题】B024_LC_N 天后的牢房(状态压缩 + 循环节)相关推荐

  1. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

  2. 思维题 UVA 10881 Piotr's Ants

    题目传送门 1 /* 2 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 3 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 4 关键2:蚂蚁的相对位置 ...

  3. CSP难度的经典题目/有趣的思维题选讲(一)

    引言 这里讲到的难题是一部分非常典型的题目,但并不是所有.因此这并非是一个全面的知识列表,而只适合提高组同学用来提升能力和拓展视野. 这篇文章在很多地方讲述的不够详细和严谨,因为它的作用并非是题解,而 ...

  4. yoyo思维题(困难) 组合数学

    问题 B: yoyo思维题(困难) 时间限制: 1 Sec  内存限制: 256 MB 提交: 11  解决: 3 [提交][状态][讨论版][命题人:qianyouyou][Edit] [TestD ...

  5. CodeForces - 1102A(思维题)

    https://vjudge.net/problem/2135388/origin Describe You are given an integer sequence 1,2,-,n. You ha ...

  6. ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)

    题干: Each New Year Timofey and his friends cut down a tree of n vertices and bring it home. After tha ...

  7. LeetCode 957. N 天后的牢房(查找循环节)

    1. 题目 8 间牢房排成一排,每间牢房不是有人住就是空着. 每天,无论牢房是被占用或空置,都会根据以下规则进行更改: 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用. 否则,它 ...

  8. TSOJ 好好做题(屑)——递推状态压缩+高精度

    文章目录 题目描述 解题思路 喜闻乐见的AC代码 补充一:高精度 补充二:状态压缩 完整注释代码 后记 题目描述 选修程序设计和算法课程的学生人数为 n,任课老师设置了 m 道练习题目(其中:1 &l ...

  9. 字符串——BZOJ 3097: Hash Killer I【构造题,思维题】

    BZOJ 3097: Hash Killer I[构造题,思维题] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3097 题意:让你出一组 ...

最新文章

  1. AlphaGo“兄弟”AlphaFold出世,DeepMind再创记录
  2. 点分治问题 ----------- HDU 5977 or 2016年大连ICPC [点分治+状态压缩]
  3. 基础数学:通俗解释,啥叫随机变量?
  4. Python 一路走来 Django
  5. 中yeti不能加载_将 PQ 查询加载到 Excel 中进行分析的三种常用的方式
  6. 突破极限–如何使用AeroGear Unified Push for Java EE和Node.js
  7. LigoWave(力格微)无线网桥稳定性探秘——私有协议
  8. Pytorch解决LSTM前向传播时报错:RuntimeError: input must have 3 dimensions, got 2
  9. git 本地代码到远程库
  10. Davids阅读笔记:《Redis设计与实现》
  11. 阻容感基础03:电阻器分类(1)-片式电阻器
  12. 苹果手机微信怎么接龙_微信又更新了:群接龙怎么玩?文件如何备份?怎么发高清大视频?...
  13. 可重入锁synchronized 和 ReentrantLock
  14. 在Excel中激活数据分析工具
  15. 【云驻共创】初探数通网络开放可编程
  16. 品优购项目-项目,背景,设计,文件夹,ico图标,网站优化三大标签,字体icomoon等介绍...
  17. LeetCode hot-100 简单and中等难度,31-40.
  18. ssm基于微信小程序的毕业论文选题管理系统小程序 uinapp
  19. php 连接 ldap 实例,使用PHP连接LDAP服务器
  20. 节点(属性、层级、操作)

热门文章

  1. 小米 IPO,外媒如何看待其首日表现?
  2. 【信息系统项目管理师】第三章 项目立项管理(考点汇总篇)
  3. 王哲iWeb峰会演讲:Cocos引擎不玩概念,厚积薄发助创业者把握H5游戏浪潮
  4. 【Pygame小游戏】Python原来还能这么学:还算能玩儿的飞机射击类游戏~(不好玩儿直到写出你满意的)
  5. 创业板股票提示没有交易权限,怎么开通创业板股票交易权限?
  6. 微软 Build 2019:IE 重生,Azure 成主角;华为拟在英剑桥新建半导体研发基地,与ARM做邻居……...
  7. FFmpeg源代码简单分析-其他-libswscale的sws_getContext()
  8. 中国爬虫违法违规案例汇总!
  9. 微型计算机系统包括哪两大部分,1.一个完整的计算机系统是由哪两大部分组成...
  10. 团队敏捷实践:迭代演示会议规则--用户故事