大家好,今天刷到了动态规划类型的题,原先对动态规划具体是什么并没有概念,今天趁机了解了一下。很多人觉得动态规划问题就是递归。但我觉得动态规划问题更应该是状态的定义和状态转移方法的定义。通过初始状态和寻找状态转移方法对一个复杂问题进行拆分。
先看下问题描述:
思路:我最开始不了解动态规划思路的时候想到的是最简单粗暴的排列组合的方法,应该也是对的,但是运行会超时。
也是我的心血,还是放上代码:
class Solution {
public:
int climbStairs(int n) {
int result = 0;//输出
int num = 0;//有几个2
int res = 0;//判断奇偶
if(n <= 2)
return n;
else{
while(n/2 != 0){
num++;
}
res = n % 2;
if(res){
int temp= 1;//有几个1
for(int i = num;i >= 0;i--){
result += pow((i + 1),temp);
temp += 2;
}
return result;
}
else{
int temp= 0;//有几个1
for(int j = num;j >= 0;j--){
result += pow((j + 1),temp);
temp += 2;
}
return result;
}
}
}
};
下面介绍动态规划思想的解题思路:我们假设S(n)表示上n节台阶的方法数。假设我第一步跨1节,则剩下的方法为S(n - 1),假设我第一步跨2节,则剩下的方法为S(n - 2)。而第一步只有1或2节这两个选项,因此我们可以得到S(n) = S(n - 1) + S(n - 2)。这就是状态转移方法,而初始情况为S(1) = 1,S(2) = 2.这就与斐波那契数列的演变相契合。我们就可以依照此,进行递归。
代码如下:
class Solution {
public:
int climbStairs(int n) {
int result;
if(n <= 2)
return n;
else{
int a = 1;
int b = 2;
result = 0;
for(int i = 3;i <= n;i++){
result = a + b;
a = b;
b = result;
}
}
return result;
}
};
动态规划的题目思路很重要,还有很多要学习的,我们下期见!