题目

n*m的矩阵,只用正方形铺。求最少正方形个数。

n,m<=13

思路

贪心:

加入是最大的正方形,显然行不通,比如n=11,m=13。那么贪心策略是1个11,其余是大小为2的正方形5个,大小为1的两个。一共1+5+2=8个。

然而正确答案是7一个,6一个,5一个,4两个,1一个,共6个。

DP:

直接尝试所有方案:

f(n,m)

if(n=m) 返回1.

if(n=1||m=1)返回不等于1的。

if(n小于m) 交换n,m//使得n>=m

如果memo中计算过,则直接返回。

for(i=[1,m])

在左上角放入大小为i的正方形。那么剩下来的部分有两种方法:以正方形的两条线把矩阵分割成一共三个部分。

f(m-i,n)+f(i,n-i)或者f(n-i,m)+f(m-i,i)。这两种方案取小者。

上面的思路是错误,对于下面的形式不能适用。

普通形式应该是上图这样的。之前的形式是上图的特殊情况。

以中间的矩形为观测中心,矩形上界为i1,下界为i2,左界为j1,右界为j2。因为是左上角是正方形,所以j1=i2.

实现手段用DP即可。计算f(n,m)时,只依赖于参数小于n、m的值。

递推公式:

f(n,m)=1+f(i2-i1,j2-j1)中间的+f(i1,m-j1)右上角的+f(n-i2,j2)左下角+f(n-i1,m-j2)

其中j1=i2,因为左上角是正方形。

1<=i1<=i2<=n;j1<=j2<=m,遍历这些值取最小值即可。

出口:m==n时,直接返回1.n或者m有一个为0时,返回0,代表有线重合,是某种特殊情况。

public int tilingRectangle(int n, int m) {
int[][] dp = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {//dp[i][j]=dp[j][i]
dp[i][j] = getRes(dp, i, j);
}
}
return dp[n][m];
} /**
* @param dp
* @param n
* @param m
* @return
*/
private int getRes(int[][] dp, int n, int m) {
if (n == m) {
return 1;
}
int min = Integer.MAX_VALUE;
for (int i1 = 1; i1 <= n; i1++) {
for (int i2 = i1; i2 <= n; i2++) {
// for (int j1 = 1; j1 <= m; j1++) {//左上角正方形,j1=i2
int j1 = i2;
for (int j2 = j1; j2 <= m; j2++) {
int tmpRes = 1 + dp[n - i2][j2] + dp[i1][m - j1] + dp[n - i1][m - j2] + dp[i2 - i1][j2 - j1];
min = Math.min(tmpRes, min);
} } }
return min;
}

LeetCode1240铺瓷砖的更多相关文章

  1. yzm10铺瓷砖 yzm10原创系列

    yzm10铺瓷砖 一天yzm10接到任务,要求用2×1大小的瓷砖,来铺2×4的地面,地面需要恰好被铺满.这对yzm10来说太容易了,于是他马上设计出了5种不同的铺法(旋转情况算不同种,如图示2.4). ...

  2. yzm10铺瓷砖 一只小蜜蜂 ycb与取款机

    yzm10铺瓷砖 一天yzm10接到任务,要求用2×1大小的瓷砖,来铺2×4的地面,地面需要恰好被铺满.这对yzm10来说太容易了,于是他马上设计出了5种不同的铺法(旋转情况算不同种,如图示2.4). ...

  3. 嵌入式开发之davinci--- 8148/8168/8127 中的二维图像处理内存tiler 铺瓷砖

    http://blog.csdn.net/shanghaiqianlun/article/details/7619603

  4. noip模拟赛 铺瓷砖

    [问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖, 你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度为A/B贴在第二行的每块瓷 ...

  5. 蓝桥杯-铺瓷砖(dfs)

    问题描述 有一长度为N(1< =N< =10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一 ...

  6. leetcode 1240. 铺瓷砖(回溯,DFS)

    题目链接 https://leetcode-cn.com/problems/tiling-a-rectangle-with-the-fewest-squares/ 题意: 用尽可能少的正方形瓷砖来铺地 ...

  7. 套题T7

    P4712 铺瓷砖 时间: 1000ms / 空间: 65536KiB / Java类名: Main   描述

  8. Android学习笔记12:图像渲染(Shader)

    在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...

  9. 10.27 noip模拟试题

    1.铺瓷砖(tile.cpp/c/pas)[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行 ...

随机推荐

  1. Shell 管道指令pipe

    目录 管道命令pipe 选取命令 cut.grep cut 取出需要的信息 grep 取出需要行.过滤不需要的行 排序命令 sort.wc.uniq sort 排序 假设三位数,按十位数从小到大,个位 ...

  2. 浅谈MySQL数据库面试必要掌握知识点

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 MySQL官方地址 https://www.mysql.com/ MySQL 8系列最新版本为8.0.27,5系列的最 ...

  3. Go知识盲区--闭包

    1. 引言 关于闭包的说明,曾在很多篇幅中都有过一些说明,包括Go基础--函数2, go 函数进阶,异常与错误 都有所提到, 但是会发现,好像原理(理论)都懂,但是就是不知道如何使用,或者在看到一些源 ...

  4. 链栈(C++)

    链栈,字面意思,就是用链表来实现一个栈的数据结构. 那么,只需将单链表的头节点当作栈顶,尾节点当作栈底.入栈只需要头插,出栈只需头删即可.所以只需要吧单链表稍微阉割一下就可以得到链式栈了.代码如下 / ...

  5. Android EditText软键盘显示隐藏以及“监听”

    一.写此文章的起因 本人在做类似于微信.易信等这样的聊天软件时,遇到了一个问题.聊天界面最下面一般类似于如图1这样(这里只是显示了最下面部分,可以参考微信等),有输入文字的EditText和表情按钮等 ...

  6. Copy constructor vs assignment operator in C++

    Difficulty Level: Rookie Consider the following C++ program. 1 #include<iostream> 2 #include&l ...

  7. 【Java 基础】Java日期格式问题

    1. Use SimpleDateFormat to format Date. Watch out, SDF is NOT THREAD-SAFE, it might not be important ...

  8. 05 - Vue3 UI Framework - Button 组件

    官网基本做好了,接下来开始做核心组件 返回阅读列表点击 这里 目录准备 在项目 src 目录下创建 lib 文件夹,用来存放所有的核心组件吧.然后再在 lib 文件夹下创建 Button.vue 文件 ...

  9. tableau创建点位地图

    一.双击省/自治区字段 二.双击销售额字段,标记类型改为圆 三.省/自治区字段设置标签显示,圆的大小和颜色细节调整,最终结果如下图所示

  10. [BUUCTF]PWN18——bjdctf_2020_babystack

    [BUUCTF]PWN18--bjdctf_2020_babystack 附件 步骤: 例行检查,64位,开启了nx保护 试运行一下程序 大概了解程序的执行过程后用64位ida打开,shift+f12 ...