蓝桥杯国赛-矩阵计数三种解法-java实现
题目提交
code
1. dfs暴力搜索
深搜所有状态,填X时要判断是否可行,没啥可说,暴力就完了,不过居然能过,规模确实小。
import java.util.Scanner;//暴搜居然过
public class 矩阵计数_dfs暴搜 {static int[][] map;static int n;static int m;static int ans;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();sc.close();//long a=System.currentTimeMillis();map = new int[n][m];dfs(0,0);System.out.println(ans);//System.out.println(System.currentTimeMillis()-a);}static void dfs(int x, int y) {if (x == n) {ans++;return;}if ((x < 2 || map[x - 1][y] == 0 || map[x - 2][y] == 0)&& (y < 2 || map[x][y - 1] == 0 || map[x][y - 2] == 0)) {//判断是否可以为Xmap[x][y] = 1;if (y < m - 1)dfs(x, y + 1);elsedfs(x + 1, 0);map[x][y] = 0;}if (y < m - 1)dfs(x, y + 1);elsedfs(x + 1, 0);}
}
2. dfs+二进制枚举
用二进制来表示每一行的所有状态,省时省力。
不懂请搜:二进制枚举
import java.util.Scanner;public class 矩阵计数_dfs_二进制枚举 {static int[] map;static boolean[] vis;static int n;static int m;static int max;static int ans;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();sc.close();//long a = System.currentTimeMillis();map = new int[n];max = 1 << m;vis = new boolean[max];for (int i = 0; i < max; i++) {vis[i] = check(i);}dfs(0);System.out.println(ans);//System.out.println(System.currentTimeMillis() - a);}static void dfs(int x) {if (x == n) {ans++;return;}for (int i = 0; i < max; i++) {if (!vis[i]&&(x < 2 || (map[x - 1] & map[x - 2] & i) == 0)) {map[x] = i;dfs(x + 1);}}}//判断是否有三个1连续static boolean check(int x) {int ans = 0;while (x > 0) {if ((x & 1) == 1)ans++;elseans = 0;if (ans == 3)return true;x >>= 1;}return false;}
}
3. 状态压缩动态规划(状压dp)
同样用到了二进制
参考(python)
dp[i][j][k],表示第i行状态为j,上一行状态为k时,符合条件的方案数。
初始化:dp[0][i][0] = 1;j为每个符合条件的二进制状态。
转换方程:
for (int i = 1; i < n; i++)for (int j : list)for (int k :list)for (int p : list)if ((j & k & p) == 0)//判断有无连续三个1dp[i][j][k] += dp[i - 1][k][p];
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class 矩阵计数_动态规划 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();sc.close();//long a = System.currentTimeMillis();List<Integer> list = new ArrayList<>();int state=1<<m;for (int i = 0; i < state; i++) {//筛选符合条件状态if (!check(i))list.add(i);}int[][][] dp = new int[n][state][state];//初始化for (int i : list)dp[0][i][0] = 1;for (int i = 1; i < n; i++)for (int j : list)for (int k :list)for (int p : list)if ((j & k & p) == 0)//判断有无连续三个1dp[i][j][k] += dp[i - 1][k][p];//统计int ans = 0;for (int i : list)for (int j : list)ans += dp[n - 1][i][j];System.out.println(ans);//System.out.println(System.currentTimeMillis() - a);}static boolean check(int x) {int ans = 0;while (x > 0) {if ((x & 1) == 1)ans++;elseans = 0;if (ans == 3)return true;x >>= 1;}return false;}
}
4. 三者对比
以6x6矩阵对比:
第三行为耗时,单位毫秒。
动态规划一骑绝尘,不过赛场上的话还是暴力直接过吧,时间有限。
蓝桥杯国赛-矩阵计数三种解法-java实现相关推荐
- 49-2017年第八届蓝桥杯国赛试题及详解(Java本科B组)
蓝桥杯历年真题题目及题解目录汇总(推荐) 蓝桥杯算法模板常用套路及API等个人总结 ---------------------------------------------------------- ...
- 2013年第四届蓝桥杯国赛试题及详解(Java本科B组)
蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分10分) 结果填空 (满分12分) 代码填空 (满分8分) 程序设计(满分17分) 程序设计(满分22分) 程序设计(满分31分) 1.标题:猜灯谜 ...
- 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解 更新:成绩出来了,估分50分左右,最后拿了个国二,还差点到国一,有点出乎意料,挺满意了挺满意了. 去年国赛基本都是暴力,最后国三都没拿到(我是 ...
- 蓝桥杯国赛五一训练赛(1)
蓝桥杯国赛五一训练赛(1)(链接) 问题 A: 费解的开关 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变 ...
- 蓝桥杯国赛 C/C++ ABC组题解(第四届 ~ 第十二届)
2020年第十一届蓝桥杯国赛 题号 类型 C++ A组 C++ B组 C++ C组 试题A 结果填空 合数个数 美丽的 2 美丽的 2 试题B 结果填空 含 2 天数 (日期处理) 扩散 (BFS) ...
- 蓝桥杯国赛知识点汇总
蓝桥杯国赛备赛总结知识点,以老师给的为原型,添加自己理解,供大家参考,后期不定时更新. 基础 1.熟练掌握API1.8常用方法 2.大数(高精度)加减乘除 3.并查集 模板: public class ...
- 第十二届蓝桥杯国赛真题+题解 Python
文章目录 写在前面 试题A:带宽 试题 B: 纯质数 试题C: 完全日期 试题D: 最小权值 试题 E: 大写 试题 F: 123 试题 G: 冰山 试题 H: 和与乘积 试题 I: 二进制问题 试题 ...
- 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)
[写在前面的话19.04.04] 今年省赛的结果出的意外得快,有很多小伙伴来和我分享他们进了省一的喜悦,并问我啥时候更新国赛题解,emmm--不是我不想更新,实在是抽不出时间,有缘再更--虽然不更新题 ...
- 太空大战-第14届蓝桥杯国赛Scratch真题中级组第6题
[导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第148讲. 太空大战,本题是2023年5月28日上午 ...
最新文章
- laravel(二):laravel基本入门 看到Hello Laravel
- 前端(二)之 CSS
- Building Fire Stations 39届亚洲赛牡丹江站B题
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
- 没有新芯片,没有“大核弹”,黄教主这次给大家带来了个PRADA
- java中常忽视的小问题
- rwg52_h头文件注释
- LINUX编译alsa
- linux环境搭建redis集群,Linux下搭建Redis分布式集群(详细图解演示)
- java 打印心_在Java中打印输出心形图案!
- python公式计算_Python Numpy计算各类距离的方法
- 旧电脑改路由器加文件服务器,如何将旧电脑改成软路由器 以winxp系统为例
- 南华大学计算机系宿舍,2021年南华大学新生宿舍条件和宿舍环境图片
- IMX6ULL - 移植uboot-imx_v2020.04_5.4.70_2.3.0
- ubuntu小技巧6--如何修复Ubuntu系统引导项
- 经验分布函数无偏性的证明和方差的推导
- 如何合并svn分支到主干上
- 全球与中国触摸屏IC市场现状及未来发展趋势
- ChatGPT:微软人工智能Office和电邮即将登场...
- matlab和ccd相机通讯,串口通讯在CCD相机系统中的应用