码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • LeetCode 790. 多米诺和托米诺平铺


    LeetCode 790. 多米诺和托米诺平铺

    • 一、题目(经典动态规划)
    • 二、解题思路
      • 1. 铺满2*N面积:
      • 2. 对于第i列,有4种情况:
      • 3. N-1 -> N 转移方程:
    • 三、核心代码
    • 四、代码中存在的一些知识性问题
      • 1. 二层vector的定义、初始化
      • 2. mod
    • 五、代码的最终呈现

    一、题目(经典动态规划)

    两种形状的瓷砖(一种是12的,另一种是12+11的形状),拼2N面积,有多少种拼法(旋转图形算两种不同的,不算成同一种。)

    二、解题思路

    1. 铺满2*N面积:

    翻译过来也即:

    1. 第N-1列及之前列全满;
    2. 第N列全满;
    3. 第N+1列及之后列全空。

    2. 对于第i列,有4种情况:

    1. 一个正方形都没有被覆盖,记为状态 0;
    2. 只有上方的正方形被覆盖,记为状态 1;
    3. 只有下方的正方形被覆盖,记为状态 2;
    4. 上下两个正方形都被覆盖,记为状态 3。

    例如本题最后第N列是满的,所以i=N的时候对应状态3。

    3. N-1 -> N 转移方程:

    在这里插入图片描述

    三、核心代码

    dp[0][3]=1;
    for(int i = 1;i <= n; i++)
    {
    	dp[i][0] = dp[i-1][3];
    	dp[i][1] = (dp[i-1][0]+dp[i-1][2]);
    	dp[i][2] = (dp[i-1][0]+dp[i-1][1]);
    	dp[i][3] = (dp[i-1][0]+dp[i-1][1]+dp[i-1][2]+dp[i-1][3]);
    }
    return dp[n][3];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    四、代码中存在的一些知识性问题

    1. 二层vector的定义、初始化

    二层vector的定义:

    1. vector>(4);
    2. vector>vec; 最后每个元素值都是int类型(本题由于最后的值会很大,故使用long long: vector>)
    3. vector>vec(5);此处表明:外层是5个元素,也即: [[],[],[],[],[]],最后每个元素值都是int类型
    4. vector>vec(5,vector(4));此处表明:外层是5个元素,内层是4个元素,且是vector类型。此处为了同时定义内外层元素个数,采用了这种形式: vector>dp(n+1,vector(4));(虽然不是很理解,但是也会用了)

    vector大部分情况下会把值初始化为0:

    1. vector默认初始化,即不指定元素个数和值,此时vector的元素个数为0
    2. vector初始化指定元素个数,但不指定元素的值,此时元素的值默认初始化为0
    3. vector初始化指定元素的个数和值
    4. 通过rezise()函数重新调整二维vector的外层元素个数,则实际上内层vector的元素个数仍为0
    5. 通过rezise()函数重新调整二维vector的内外层元素个数,若为指定初始值,则默认初始化为0
      所以在本题中, vector>dp(n+1,vector(4));这一句实际上已经把所有元素初始化成0了

    2. mod

    题目说返回对 10^9 + 7 取模 的值,但是标答在转移方程中就取模了。所有的转移都是采用的加法,所以在中间步骤取模也没事。

    五、代码的最终呈现

    class Solution {
    public:
        int numTilings(int n) 
        {
            long long mod = 1e9 + 7;
            vector<vector<long long>>dp(n+1,vector<long long>(4));
            dp[0][3]=1;
            for(int i = 1;i <= n; i++)
            {
                dp[i][0] = dp[i-1][3];
                dp[i][1] = (dp[i-1][0]+dp[i-1][2])%mod;
                dp[i][2] = (dp[i-1][0]+dp[i-1][1])%mod;
                dp[i][3] = (dp[i-1][0]+dp[i-1][1]+dp[i-1][2]+dp[i-1][3]) % mod;
            }
            
            return dp[n][3];
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这一题掺杂了个人的很多不恰当的理解orz

  • 相关阅读:
    umi配置实战
    【小沐学前端】Windows下搭建WordPress(nginx1.25、PHP8.2、WordPress6.3、MySQL5.7)
    Python中的函数式编程是什么?
    firefly3399 移植linux5.15.80 - 2022-11-27
    【php详细笔记】上传文件到服务器
    先秦文学知识点总结
    第七章 Linux服务器硬件及RAID配置实战
    05-Linux部署MySQL
    11. 对象创建模式之 Builder模式(构建器)(不常用)
    java计算机毕业设计菲特尼斯健身管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/weixin_43737395/article/details/127819998
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号