leetcode 1240. 铺瓷砖(回溯,DFS)
题目链接
https://leetcode-cn.com/problems/tiling-a-rectangle-with-the-fewest-squares/
题意:
用尽可能少的正方形瓷砖来铺地板
思路:
按行递推,每一行的情况扫完之后统计下一行的所有情况
每次填补前判断是否之前已经有瓷砖填上了
难点在于:怎么记录填补一个正方形后,剩余地板的状态信息
(其实不用每次记录剩下的信息,只是下次填剩下的地板时判断一下有没有被填过即可)
class Solution {
public:
// https://leetcode.com/problems/tiling-a-rectangle-with-the-fewest-squares/discuss/414979/Java-back-tracking-solution
//怎么表示分割之后剩下的状态
int ans=INT_MAX;
int vis[14][14];
//回溯
void solve(int r,int c,int n,int m,int cnt){
if(cnt>ans) return;
if(r>=n) {
ans=min(cnt,ans);
return ;
}
if(c>=m){
solve(r+1,0,n,m,cnt);
return ;
}
if(vis[r][c]) solve(r,c+1,n,m,cnt);
for(int k=min(n-r,m-c);k>0 && check(r,c,k);k--){
//染色k
col(r,c,k,1);
solve(r,c+k,n,m,cnt+1);//按行扫描
col(r,c,k,0);//回溯
}
}
bool check(int r,int c,int k){
for(int i=0;i<k;i++){
for(int j=0;j<k;j++){
if(vis[r+i][c+j]) return false;
}
}
return true;
}
void col(int r,int c,int k,int colo){
for(int i=0;i<k;i++){
for(int j=0;j<k;j++){
vis[r+i][c+j]=colo;
}
}
}
int tilingRectangle(int n, int m){
solve(0,0,n,m,0);
return ans;
}
// int dp[14][14]={0};
// int tilingRectangle(int n, int m) {
// if(n==0 || m==0) return 0;
// if(n==m) return dp[n][m]=1;
// if(dp[n][m]) return dp[n][m];
// int ans=INT_MAX;
// //按行覆盖,每次的步长前进为1
// for(int x=min(n,m);x>0;x--){
// ans=min(ans,1+tilingRectangle(n-x,x)+tilingRectangle(n,m-x));//交错的情况,严格来说不对。。
// }
// dp[n][m]=ans;
// return ans;
// }
};
leetcode 1240. 铺瓷砖(回溯,DFS)的更多相关文章
- [LeetCode] 79. 单词搜索(DFS,回溯)
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
- LeetCode刷题总结-DFS、BFS和回溯法篇
本文总结LeetCode上有关深度优先搜索(DFS).广度优先搜索(BFS)和回溯法的算法题,推荐刷题总数为13道.具体考点分析如下图: 一.深度优先搜索 1.字符匹配问题 题号:301. 删除无效的 ...
- LeetCode编程训练 - 回溯(Backtracking)
回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...
- LeetCode Subsets II (DFS)
题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...
- HDU 1010Tempter of the Bone(奇偶剪枝回溯dfs)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- [LeetCode] 46. 全排列(回溯)
###题目 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ...
- POJ 3009 Curling 2.0【带回溯DFS】
POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...
- 回溯 DFS 深度优先搜索[待更新]
首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权! 1.概念 回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...
- Leetcode 130 Surrounded Regions DFS
将内部的O点变成X input X X X XX O O X X X O XX O X X output X X X XX X X XX X X XX O X X DFS的基本框架是 void dfs ...
随机推荐
- 算法(Java实现)—— 分治算法
分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...
- 【漏洞测试】SUDO:CVE-2019-14287
漏洞详情 sudo错误的处理了某些用户id.攻击者可以以根用户身份执行任意命令. 系统平台 kali-Linux 软件版本 1.8.27 sudo作用 非root用户不需要知道root密码,就可以执行 ...
- 【Java】Java Win10环境搭建--JDK、Eclipse
win10安装Java JDK环境及Eclipse安装使用(Hello world) win10环境下安装Java环境,对于小白来说简直是头疼,因为Java内部环境有着JDK和JRE两块,互相牵扯着很 ...
- 10 个 GitHub 上超火的 CSS 奇技淫巧项目,找到写 CSS 的灵感!
大家好,我是你们的 超级猫,一个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 如果 CSS 是女孩子,肯定如上图那样吧
- OSPF综合实验
实验要求: 1.R4为ISP,其上只能配置IP地址,R4与其他所有直连设备间使用共有IP 2.R3--R5/6/7为MGRE环境,R3为中心站点 3.整个OSPF环境IP地址为172.16.0.0/1 ...
- js 根据条件删除数组中某个对象&js filter (find)过滤数组对象的使用
删除 ---- item不设置 arr.splice(1,1) //['a','c','d'] 删除起始下标为1,长度为1的一个值,len设置的1,如果为0,则数组不变 arr. ...
- C#使用时间戳
前言 参考博客 C#获取和转换时间戳: https://blog.csdn.net/weixin_39885282/article/details/79462443 获取时间戳: https://ww ...
- Prometheus从入门到精通:一、部署
一.Prometheus是什么? prometheus是一个开源指标监控解决方案,指标就是指的CPU的使用率.内存使用率等数据. 二.Prometheus的架构 这里直接粘贴官网的架构图: 三.安装 ...
- 任务调度框架Quartz快速入门!
目录 Quartz是什么 Quartz中的重要API及概念 超重要API 重要概念 Quartz设计理念:为什么设计Job和Trigger? 最简单的Quartz使用案例 Job实例和JobDetai ...
- 7.自定义ViewGroup-下滑抽屉
1.效果 2.思路 分析效果: 1.布局分为两部分,后面部分,前面部分,默认状态后面被挡住: 2.后面不可以滑动,前面可以滑动: 3.如果前面的布局本身是可以滑动的,那么当前面布局滑动到第一个时,后面 ...