剑指offer 动态规划 Python and C++
1、斐波拉契数列
2、跳台阶
3、变态跳台阶
4、矩阵覆盖
斐波拉契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
思路
斐波拉契数列:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
只需定义两个整型变量,b表示后面的一个数字,a表示前面的数字即可。每次进行的变换是: a,b = b,a+b
python
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n<=0:
return 0
a = b = 1
for i in range(2, n):
a, b = b, a+b
return b
C++
class Solution {
public:
int Fibonacci(int n) {
if(n<=0)
return 0;
int a =1;
int b = 1;
for(int i=2;i<n;i++)
{
int temp;
temp = a +b;
a = b;
b = temp;
}
return b;
}
};
跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路
其实和斐波拉契差不多,青蛙上第一个台阶的时候,是一种方法,第二个台阶的时候是两种分法,第一种就是,走两个一阶梯,或者一次走两个阶梯,两种方法。第三个台阶的时候,是从第一个台阶的方法,加上从第二个台阶来的,
python
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
if number<=0:
return 0
if number==1:
return 1
a = 1
b = 2
for i in range(2, number):
a , b = b, a+b
return b
C++
class Solution {
public:
int jumpFloor(int number) {
if (number==0)return 0;
if (number==1)return 1;
if (number==2) return 2;
int b=2;
int a=1;
int temp;
for(int i=3;i<=number;i++)
{
temp = a + b;
a = b;
b = temp;
}
return temp;
}
};
变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
n=0时,f(n)=0;n=1时,f(n)=1;n=2时,f(n)=2;假设到了n级台阶,我们可以n-1级一步跳上来,也可以不经过n-1级跳上来,所以f(n)=2*f(n-1)。
推公式也能得出:
n = n时:f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) = f(0) + f(1) + f(2) + ... + f(n-1)
由于f(n-1) = f(0)+f(1)+f(2)+ ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)
所以f(n) = f(n-1)+f(n-1)=2*f(n-1)
python
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
if number<=0:
return 0
elif number ==1:
return 1
a = 1;
for i in range(1, number):
b = a*2
a = b
return b
C++
class Solution {
public:
int jumpFloorII(int number) {
if (number<=0)
return 0;
else if (number == 1)
return 1;
int a = 1;
int b = 2;
for(int i = 1; i<number; i++)
{
b = 2*a;
a = b;
}
return b;
}
};
矩阵覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路
和跳台阶的一样的思路,或者看这个人写的挺好的。
https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6?answerType=1&f=discussion
python
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if number<=0:
return 0
if number==1:
return 1
a = 1
b = 2
for i in range(2, number):
a , b = b, a+b
return b
C++
class Solution {
public:
int rectCover(int number) {
if (number==0)return 0;
if (number==1)return 1;
if (number==2) return 2;
int b=2;
int a=1;
int temp;
for(int i=3;i<=number;i++)
{
temp = a + b;
a = b;
b = temp;
}
return temp;
}
};