【动态规划】大番茄的dp学习笔记

例题

1 小青蛙跳台阶

一只青蛙一次可以跳一级台阶,也可以一次跳两个台阶,求青蛙跳上n阶台阶一共有多少种跳法?
LeetCode原题

思路:

将问题转化为对“最后一步”的判断,可以逐步对问题进行“降级”。
设dp[n]是一共要走n阶时的解决方案数目(跳法)。
若最后一步是一步,则子问题变成dp[n-1];若最后一步是两步,则子问题变成dp[n-2]。因为这两种情况都有可能,所以dp[n]=dp[n-1]+dp[n-2]。

代码 c++

class Solution {
public:
    int dp[101]={0};
    int numWays(int n) {
        dp[0]=1;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<101;i++){
            dp[i]=(dp[i-1]+dp[i-2])%1000000007;
        }
        return dp[n];
    }
};

代码 python

class Solution:
    def numWays(self, n: int) -> int:
        base = 1e9 + 7
        if n % base == 0 or n % base == 1:
            return 1
        dp = [0 for _ in range(n + 1)]
        dp[0] = 1
        dp[1] = 1
        for i in range(2, len(dp)):
            dp[i] = (dp[i - 1] + dp[i - 2]) % base
        return int(dp[n])

py代码出处

2 牛牛铺地毯

牛牛铺地毯

思路

处理方法其实和小青蛙类似。
首先我们分析这些瓷砖到底可以怎么铺:分析 带图
(1)3x2的横着铺,占3格(横着三格)。
(2)1x2的竖着铺,占一格。
(3)1x2的横着铺,铺两块,占两格。
正所谓,一招鲜吃遍天,我们对这一题做同样的处理。
设长度为n的解决方案一共有dp[n]个,我们对最后一步进行分析:
1、若最后一步是(1),则子问题是dp[n-3]
2、若最后一步是(2),则子问题是dp[n-1]
3、若最后一步是(3),则子问题是dp[n-2]
所以得到递推公式dp[n]=dp[n-1]+dp[n-2]+dp[n-3],(n>=3)

代码 c++

#include<bits/stdc++.h>
using namespace std;
int dp[100001]={0};
int main(){
    dp[0]=0;
    dp[1]=1;
    dp[2]=2;
    dp[3]=4;
    for(int i=4;i<100001;i++){
        dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%10007;
    }
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int t;
        cin>>t;
        cout<<dp[t]<<endl;
    }
}

3 约翰的后花园

原题

约翰的后花园
约翰
这道题是属于比较简单的,要思路的话直接看代码即可。

代码 c++ 暴力解

可以直接解。

class Solution {
public:
    /**
     * @param x: the wall's height
     * @return: YES or NO
     */
    bool dp[1001]={0};
    string isBuild(int x) {
        if(x==3 || x==7) return "YES";
        for(int i=0;i<x/3;i++){
            if((x-3*i)%7==0) return "YES";
        }
        return "NO";
    }
};

代码 dp python

class Solution:
    """
    @param x: the wall's height
    @return: YES or NO
    """
    def isBuild(self, x):
        # write you code here
        if x < 3:
            return "NO"
        dp = [False for i in range(x + 1)]
        for i in range(3, len(dp)):
            if i == 3 or i == 7:
                dp[i] = True
            else:
            	# i - 7 < 0的时候是False
                dp[i] = dp[i - 3] or dp[i - 7]
        return "YES" if dp[x] else "NO"

代码出处

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个大番茄z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值