题目链接

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)的更多相关文章

  1. [LeetCode] 79. 单词搜索(DFS,回溯)

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  2. LeetCode刷题总结-DFS、BFS和回溯法篇

    本文总结LeetCode上有关深度优先搜索(DFS).广度优先搜索(BFS)和回溯法的算法题,推荐刷题总数为13道.具体考点分析如下图: 一.深度优先搜索 1.字符匹配问题 题号:301. 删除无效的 ...

  3. LeetCode编程训练 - 回溯(Backtracking)

    回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...

  4. LeetCode Subsets II (DFS)

    题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...

  5. HDU 1010Tempter of the Bone(奇偶剪枝回溯dfs)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. [LeetCode] 46. 全排列(回溯)

    ###题目 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ...

  7. POJ 3009 Curling 2.0【带回溯DFS】

    POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...

  8. 回溯 DFS 深度优先搜索[待更新]

      首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权!   1.概念   回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...

  9. 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 ...

随机推荐

  1. 算法(Java实现)—— 分治算法

    分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...

  2. 【漏洞测试】SUDO:CVE-2019-14287

    漏洞详情 sudo错误的处理了某些用户id.攻击者可以以根用户身份执行任意命令. 系统平台 kali-Linux 软件版本 1.8.27 sudo作用 非root用户不需要知道root密码,就可以执行 ...

  3. 【Java】Java Win10环境搭建--JDK、Eclipse

    win10安装Java JDK环境及Eclipse安装使用(Hello world) win10环境下安装Java环境,对于小白来说简直是头疼,因为Java内部环境有着JDK和JRE两块,互相牵扯着很 ...

  4. 10 个 GitHub 上超火的 CSS 奇技淫巧项目,找到写 CSS 的灵感!

    大家好,我是你们的 超级猫,一个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 如果 CSS 是女孩子,肯定如上图那样吧

  5. OSPF综合实验

    实验要求: 1.R4为ISP,其上只能配置IP地址,R4与其他所有直连设备间使用共有IP 2.R3--R5/6/7为MGRE环境,R3为中心站点 3.整个OSPF环境IP地址为172.16.0.0/1 ...

  6. js 根据条件删除数组中某个对象&js filter (find)过滤数组对象的使用

    删除 ----  item不设置 arr.splice(1,1)   //['a','c','d']         删除起始下标为1,长度为1的一个值,len设置的1,如果为0,则数组不变 arr. ...

  7. C#使用时间戳

    前言 参考博客 C#获取和转换时间戳: https://blog.csdn.net/weixin_39885282/article/details/79462443 获取时间戳: https://ww ...

  8. Prometheus从入门到精通:一、部署

    一.Prometheus是什么? prometheus是一个开源指标监控解决方案,指标就是指的CPU的使用率.内存使用率等数据. 二.Prometheus的架构 这里直接粘贴官网的架构图: 三.安装 ...

  9. 任务调度框架Quartz快速入门!

    目录 Quartz是什么 Quartz中的重要API及概念 超重要API 重要概念 Quartz设计理念:为什么设计Job和Trigger? 最简单的Quartz使用案例 Job实例和JobDetai ...

  10. 7.自定义ViewGroup-下滑抽屉

    1.效果 2.思路 分析效果: 1.布局分为两部分,后面部分,前面部分,默认状态后面被挡住: 2.后面不可以滑动,前面可以滑动: 3.如果前面的布局本身是可以滑动的,那么当前面布局滑动到第一个时,后面 ...