【回溯】1240. 鋪瓷磚

本文涉及知識點

回溯

LeetCode1240. 鋪瓷磚

你是一位施工隊的工長,根據設計師的要求準備為一套設計風格獨特的房子進行室內裝修。
房子的客廳大小為 n x m,為保持極簡的風格,需要使用盡可能少的 正方形 瓷磚來鋪蓋地面。
假設正方形瓷磚的規格不限,邊長都是整數。
請你幫設計師計算一下,最少需要用到多少塊方形瓷磚?
示例 1:
在這里插入圖片描述

輸入:n = 2, m = 3
輸出:3
解釋:3 塊地磚就可以鋪滿臥室。
2 塊 1x1 地磚
1 塊 2x2 地磚
示例 2:
在這里插入圖片描述

輸入:n = 5, m = 8
輸出:5
示例 3:

輸入:n = 11, m = 13
輸出:6
在這里插入圖片描述

提示:

1 <= n <= 13
1 <= m <= 13

回溯

aHas[r][c] 記錄第r行,第c列是否已經鋪設瓷磚。
先行后列處理第一個沒有鋪設的單格,從大到小嘗試鋪設瓷磚。
回溯最后一個層次:所有單格都已經鋪滿瓷磚。回溯結束:使用的磁盤是否小于結果。
一層回溯:
GetNext獲取下一個沒有鋪瓷磚的單元格格。
如果所有單格都鋪了瓷磚,則本次回溯失敗。
計算最大能鋪maxLen的瓷磚。注意:右下可能已有瓷磚。2*2的瓷磚無法放下。
在這里插入圖片描述

len = maxLen :1
將len所在單格鋪上瓷磚
回溯下一層次
將len所在單格瓷磚取消

小技巧

如果cnt已經大于等于res,則直接返回。
r,c 不必從0,0開始,從r,c+len開始。如果c+len >= m,則r++,c=0。

回溯代碼

核心代碼

template<class ELE,class ELE2>
void MinSelf(ELE* seft, const ELE2& other)
{*seft = min(*seft,(ELE) other);
}template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{*seft = max(*seft, other);
}class Solution {
public:int tilingRectangle(int n, int m) {bool vHas[13][13] = { false };int iRet = n * m;auto  GetNext = [&](int& r, int& c) {if (c >= m) {r++;c = 0;}if (r >= n) { return true; };if (!vHas[r][c]) { return true; }c++;return false;};std::function<void(int, int,int)> BackTrack = [&](int r, int c,int cnt) {if (cnt >= iRet) { return; }while (!GetNext(r, c));if (r >= n) {iRet = min(iRet, cnt);return;}int maxLen = min(n - r, m - c);for (int i = r; i < r + maxLen; i++) {for (int j = c; j < c + maxLen; j++) {if (vHas[i][j]) {MinSelf(&maxLen, i - r);MinSelf(&maxLen, j - c);}}}for (int len = maxLen; len > 0; len--) {for (int i = r; i < r + len; i++) {for (int j = c; j < c + len; j++) {vHas[i][j] = true;}}BackTrack(r, c + len, cnt + 1);for (int i = r; i < r + len; i++) {for (int j = c; j < c + len; j++) {vHas[i][j] = false;}}}			};	BackTrack(0, 0, 0);return iRet;}
};

測試用例

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){assert(v1[i] == v2[i]);}
}template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}int main()
{{Solution slu;auto res = slu.tilingRectangle(1, 1);Assert(1, res);}{Solution slu;auto res = slu.tilingRectangle(1, 2);Assert(2, res);}{Solution slu;		auto res = slu.tilingRectangle(2, 3);Assert(3, res);}{Solution slu;auto res = slu.tilingRectangle(5, 8);Assert(5, res);}{Solution slu;auto res = slu.tilingRectangle(11, 13);Assert(6, res);}	
}

擴展閱讀

視頻課程

有效學習:明確的目標 及時的反饋 拉伸區(難度合適),可以先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關下載

想高屋建瓴的學習算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對大家說的話
《喜缺全書算法冊》以原理、正確性證明、總結為主。
聞缺陷則喜是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業。也就是我們常說的專業的人做專業的事。
如果程序是一條龍,那算法就是他的是睛

測試環境

操作系統:win7 開發環境: VS2019 C++17
或者 操作系統:win10 開發環境: VS2022 C++17
如無特殊說明,本算法用**C++**實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12518.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端面試題復習 - 性能優化

圖片加載優化 很多修飾類圖片完全可以用css代替對于移動端來說&#xff0c;很多圖片都可以用CDN加載小圖使用base64格式使用雪碧圖能夠顯示WebP格式的瀏覽器盡量使用WebP格式。因為WebP格式具有更好的圖像數據壓縮算法&#xff0c;能帶來更小的圖片體積&#xff0c;而且擁有肉…

3、用Vue快雕塑搭建一個管理系統的頁面布局框架

3.2.頂部欄header 在el-header標簽里對標簽欄header進行樣式定義 <template><div id"app"><el-container><el-header style"background-color: #4c535a"><img src"/assets/logo.png" alt"" style"w…

貪心+數學

一、題目 1、題目描述 給你一個下標從 0 開始的整數數組 tasks &#xff0c;其中 tasks[i] 表示任務的難度級別。在每一輪中&#xff0c;你可以完成 2 個或者 3 個 相同難度級別 的任務。 返回完成所有任務需要的 最少 輪數&#xff0c;如果無法完成所有任務&#xff0c;返回 …

運維別卷系列 - 云原生監控平臺 之 05.prometheus alertManager 實踐

文章目錄 [toc]Alertmanager 簡介Alertmanager 實現的核心概念GroupingInhibitionSilencesClient behaviorHigh Availability Alertmanager 配置文件globaltemplatesrouteinhibit_rulesreceivers Alertmanager 部署創建 cm創建 svc創建 stsPrometheus 配置告警Prometheus 配置文…

Frida-RPC 調用

demo frida-rpc通過調用已加載到內存中的函數,直接獲取到結果: import fridardev = frida.get_remote_device() session = rdev.attach("大姨媽")scr = """rpc.exports = { encrypt(j2, str){var res;Java.perform(function () {var Crypt = Ja…

K-means 算法【python,算法,機器學習】

K-means 算法試圖將數據集中的樣本劃分為若干個子集&#xff0c;每個子集稱為一個簇&#xff0c;通過該算法使得每個聚類內的數據點盡可能相似&#xff08;即距離該聚類的中心點最近&#xff09;&#xff0c;而不同聚類之間的數據點盡可能不相似。 算法步驟如下&#xff1a; 從…

Kubernetes 的命令行工具kubectl介紹

目錄 1. 查看資源狀態2. 創建資源3. 描述資源4. 更新資源5. 刪除資源6. 暴露服務7. 狀態檢查與故障排查8. 擴縮容9. 自動補全10. 上下文管理11. 查看事件12. 資源編輯 kubectl 是 Kubernetes 的命令行工具&#xff0c;它用于與 Kubernetes 集群進行交互&#xff0c;執行各種管理…

Vu2之使用provide與inject傳遞數據案例

Vu2之使用provide與inject傳遞數據案例 在Vue 2中&#xff0c;provide 和 inject 是一對用于在組件樹中傳遞數據的高級選項。它們允許祖先組件向其所有子孫后代組件提供數據&#xff0c;而無需顯式地通過 props 或事件進行傳遞。 provide 選項是在祖先組件中聲明的&#xff0c;…

運維別卷系列 - 云原生監控平臺 之 03.prometheus label 實踐

文章目錄 [toc]label 簡介自定義標簽relabel_configsregexrelabel_action metric_relabel_configs兩者的區別 實踐 label 簡介 label 對于 Prometheus 來說&#xff0c;屬于數據處理的方式&#xff0c;Prometheus 是通過指定的 label 來查詢數據 Prometheus 的 target 中實例&…

css 步驟條虛線漸變色效果實現

效果如圖所示&#xff1a; 思路&#xff1a; 使用元素覆蓋的方式實現視覺上虛線的效果 實現代碼&#xff1a; html布局 <ul class"details-cont"><li class"details-li" v-for"item in 3" :key"item"><div class&qu…

(教程)gpt-4o如何使用,怎么體驗?gpt-4o和gpt-4-turbo的區別

今天OpenAI發布了gpt-4o&#xff0c;我體驗之后&#xff0c;gpt-4o簡直逆天了。中文能力也挺別強。速度比現在的gpt4還要快。 早在 5 月 11 日&#xff0c;Sam 就在推文中表示&#xff1a;OpenAI 并沒有推出 GPT-5&#xff0c;或搜索引擎&#xff0c;但團隊一直在努力研發一些…

Git版本控制工具的原理及應用詳解(一)

本系列文章簡介&#xff1a; 隨著軟件開發的復雜性不斷增加&#xff0c;版本控制成為了開發團隊中不可或缺的工具之一。在過去的幾十年里&#xff0c;版本控制工具經歷了各種發展和演變&#xff0c;其中Git無疑是目前最受歡迎和廣泛應用的版本控制工具之一。 Git的出現為開發者…

Nodejs 第七十章(OSS)

OSS OSS&#xff08;Object Storage Service&#xff09;是一種云存儲服務&#xff0c;提供了一種高度可擴展的、安全可靠的對象存儲解決方案 OSS 對象存儲以對象為基本存儲單元&#xff0c;每個對象都有唯一的標識符&#xff08;稱為對象鍵&#xff09;和數據。這些對象可以…

【保姆級介紹下運維】

&#x1f308;個人主頁: 程序員不想敲代碼啊 &#x1f3c6;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f44d;點贊?評論?收藏 &#x1f91d;希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff0c;讓我們共…

編譯安裝Python3

1、源碼安裝 1、安裝依賴軟件包 yum -y install gcc gcc-c zlib-devel bzip2-devel openssl-devel sqlite-devel readline-devel libffi-devel # python3.7版本安裝 2、下載 curl -o python3.6.5.tgz https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz // 或者 w…

2024年小學生古詩文大會備考:吃透歷年真題和知識點(持續)

根據往年的安排&#xff0c;2024年小學生古詩文大會預計這個月就將啟動。該如何備考2024年小學生古詩文大會呢&#xff1f;根據往期的經驗&#xff0c;只要吃透這些真題和背后的知識點&#xff0c;通過上海小學生古詩文大會的初選&#xff08;初賽&#xff09;一點問題都沒有。…

數據庫SQL語言實戰(八)

目錄 練習題 題目一 題目二 題目三 題目四 題目五 題目六 題目七 題目八 題目九 題目十 練習題 題目一 找出年齡小于20歲且是“物理學院”的學生的學號、姓名、院系名稱,按學號排序 create or replace view test6_01 as select S.sid,S.name,S.dname fr…

Myql 數據庫采用RAID存儲帶來電池充放電問題原因以及處理方式

一. 背景 Mysql作為數據庫, 在某些特定情況下會采用RAID&#xff08;冗余磁盤陣列&#xff09;進行存儲. 以保證數據庫的性能以及可靠性. 1.1. RAID種類 RAID&#xff08;冗余磁盤陣列&#xff0c;Redundant Array of Independent Disks&#xff09;是一種用于數據存儲的技術…

淺析Free RTOS中Queue的應用

目錄 概述 1 認識Queue 1.1 Queue定義 1.2 FreeRTOS中的Queue 1.3 Queue狀態 1.4 Queue內容 1.5 發送和接收Message 1.5.1 發送message 1.5.2 接收Message 2 Queue的特性 2.1 數據存儲 2.2 可被多任務存取 2.3 讀Queue時阻塞 2.4 寫Queue時阻塞 3 使用Queue 3.1…

怎么把圖片上的字去掉

將圖片上的字去掉通常需要使用圖像編輯軟件或在線工具。以下是一些常用的方法和步驟&#xff1a; 使用Adobe Photoshop&#xff1a; 打開Photoshop&#xff0c;導入需要編輯的圖片。 選擇“橡皮擦工具”或“克隆圖章工具”。 如果使用“橡皮擦工具”&#xff0c;調整橡皮擦的…