例题
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])
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"