当前位置: 首页 > news >正文

蓝桥杯每日一题2023.9.25

4406. 积木画 - AcWing题库 

题目描述

分析

 在完成此问题前可以先引入一个新的问题

291. 蒙德里安的梦想 - AcWing题库

我们发现16的二进制是 10000

15的二进制是1111

故刚好我们可以从0枚举到1 << n(相当于二的n次方的二进制表示)

 

注:奇数个0是非法的 

此处i的变化记录的是每一个状态,

这里的i每次>>j 是来记录i这个状态中0和1的个数,如果在这个过程中i是1就要看前面记录的0的个数,如果0的个数是奇数,那就会是1101这种类似状态故一定不符合事实

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 12, M = 1 << N;
ll n, m, f[N][M];
bool st[N];
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);while(cin >> n >> m){if(n == 0 && m == 0)break;for(int i = 0; i < 1 << n; i ++){st[i] = true;int cnt = 0;for(int j = 0; j < n; j ++){if(i >> j & 1){if(cnt & 1){st[i] = false;break;}}else cnt ++;}if(cnt & 1)st[i] = false;//eg.0100}memset(f, 0, sizeof f);f[0][0] = 1;for(int i = 1; i <= m; i ++){for(int j = 0; j < 1 << n; j ++){for(int k = 0; k < 1 << n; k ++){if((j & k) == 0 && st[j | k]){f[i][j] += f[i - 1][k];}}} }cout << f[m][0] << '\n';}return 0;
}

题目分析

发现一共有16种转移状态

DP[i][j]表示已经操作完i - 1列且第i列的状态为j的所有方案的集合

#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
const int mod = 1000000007;int g[4][4] = 
{{1, 1, 1, 1},{0, 0, 1, 1},{0, 1, 0, 1},{1, 0, 0, 0}, 	
};
int dp[N][4];
int main()
{int n;cin >> n;dp[1][0] = 1;for(int i = 1; i <= n; i ++)//枚举列数 {for(int j = 0; j < 4; j ++)//从j状态转移到k状态 {for(int k = 0; k < 4; k ++)//表示向k状态转移 {dp[i + 1][k] = (dp[i + 1][k] + g[j][k] * dp[i][j]) % mod;}}}cout << dp[n + 1][0];return 0;
}

列举此位置的所有状态(j)每次乘上可以转化为的所有状态(k),然后不断将此位置的所有状态相加得到此位置的所有状态,最后输出最后一列(n)且下一列所有状态为0,也就是没有伸出的一列

http://www.lryc.cn/news/175842.html

相关文章:

  • 前端面试的话术集锦第 20 篇博文——高频考点(输入 URL 到页面渲染的整个流程)
  • Android Jetpack Compose之确定重组范围并优化重组
  • 【JDK 8-集合框架进阶】6.1 parallelStream 并行流
  • C语言中结构体,枚举,联合相关介绍
  • 【干货】GNSS连续运行基准站网
  • 如何使用iPhone15在办公室观看家里电脑上的4k电影,实现公网访问本地群晖!
  • LeetCode之26.删除有序数组中的重复项和80.删除有序数组中的重复项II(C++)
  • linux驱动之input子系统简述
  • 嵌入式裸机架构的探索与崩塌
  • MySQL高级语句(第二部分)
  • HTML计时事件(JavaScript)网页电子钟+网页计时器
  • 使用群晖实现Videostation电影的大容量存储及分享教程
  • 后端大厂面试-15道题
  • C++: 冒泡排序(Bubble Sort)
  • 跨域的解决方案
  • 如何使用Java语言判断出geek是字符串参数类型,888是整数参数类型,[hello,world]是数组参数类型,2.5是双精度浮点数类型?
  • 9.20华为机试-后端
  • LC926. 将字符串翻转到单调递增(JAVA - 动态规划)
  • 【高阶数据结构】哈希的应用 {位图;std::bitset;位图的应用;布隆过滤器;布隆过滤器的应用}
  • 金融生产存储亚健康治理:升级亚健康 3.0 ,应对万盘规模的挑战
  • C语言自定义类型讲解:结构体,枚举,联合(2)
  • AI编程助手 Amazon CodeWhisperer 全面解析与实践
  • 利用EXCEL进行XXE攻击
  • 芯片验证就是一次旅行
  • Java深入理解线程的三大特性
  • 2025快手校招面试真题汇总及其解答(二)
  • PHP生成带中文的图片
  • java框架-Dubbo
  • Vue+iview 组件中通过v-for循环动态生成form表单进行表单校验
  • sns.load_dataset(“iris“)报错原因探究+解决办法