LeetCode Schedule

LeetCode Schedule

  • 动态规划
    • 70. 爬楼梯
    • 509. 斐波那契数
    • 1137. 第 N 个泰波那契数
    • 746. 使用最小花费爬楼梯
    • 198. 打家劫舍

动态规划

70. 爬楼梯

题目: 一次可以爬 12 个台阶,请问有多少种方法到达第 n 个台阶.
思路: 动态规划.

  • 状态定义: 设 d p [ i ] dp[i] dp[i] 代表爬上第 i 个台阶的方法数.
  • 状态方程: d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i]=dp[i-1]+dp[i-2] dp[i]=dp[i1]+dp[i2].
  • 初始状态: d p [ 0 ] = 1 , d p [ 1 ] = 1 dp[0]=1, dp[1]=1 dp[0]=1,dp[1]=1.
  • 返回值: d p [ n ] dp[n] dp[n].

代码:

int climbStairs(int n) {
	vector<int> dp(n + 1, 0);
	dp[0] = 1, dp[1] = 1;
	for (int i = 2; i <= n; i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
	}
	return dp[n];
}

509. 斐波那契数

题目: 求斐波那契数列的第 n 个数,其满足 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n1)+f(n2), 且 f ( 0 ) = 0 , f ( 1 ) = 1 f(0)=0,f(1)=1 f(0)=0,f(1)=1.
思路: 动态规划.

  • 状态定义: 设 d p [ i ] dp[i] dp[i] 代表第 i 斐波那契数个.
  • 状态方程: d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i]=dp[i-1]+dp[i-2] dp[i]=dp[i1]+dp[i2].
  • 初始状态: d p [ 0 ] = 0 , d p [ 1 ] = 1 dp[0]=0, dp[1]=1 dp[0]=0,dp[1]=1.
  • 返回值: d p [ n ] dp[n] dp[n].

代码:

int fib(int n) {
	if (n <= 1) return n;
	vector<int> dp(n + 1, 0);
	dp[0] = 0, dp[1] = 1;
	for (int i = 2; i <= n; i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
	}
	return dp[n];
}

1137. 第 N 个泰波那契数

题目: 求泰波那契数列的第 n 个数,其满足 f ( n ) = f ( n − 1 ) + f ( n − 2 ) + f ( n − 3 ) f(n)=f(n-1)+f(n-2)+f(n-3) f(n)=f(n1)+f(n2)+f(n3), 且 f ( 0 ) = 0 , f ( 1 ) = 1 , f ( 2 ) = 1 f(0)=0,f(1)=1,f(2)=1 f(0)=0,f(1)=1,f(2)=1.
思路: 动态规划.

  • 状态定义: 设 d p [ i ] dp[i] dp[i] 代表第 i 个泰波那契数.
  • 状态方程: d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] + d p [ i − 3 ] dp[i]=dp[i-1]+dp[i-2]+dp[i-3] dp[i]=dp[i1]+dp[i2]+dp[i3].
  • 初始状态: d p [ 0 ] = 0 , d p [ 1 ] = 1 , d p [ 2 ] = 2 dp[0]=0, dp[1]=1, dp[2]=2 dp[0]=0,dp[1]=1,dp[2]=2.
  • 返回值: d p [ n ] dp[n] dp[n].

代码:

int tribonacci(int n) {
	if (n == 0) return 0;
	if (n <= 2) return 1;
	vector<int> dp(i + 1, 0);
	dp[0] = 0, dp[1] = 1, dp[2] =1;
	for (int i = 3; i <= n; i++) {
		dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
	}
	return dp[n];
}

746. 使用最小花费爬楼梯

题目: 一次可以爬 12 个台阶, cost[i] 为从第 i 个台阶往上爬的费用, 爬到楼顶的最低花费为多少.
思路: 动态规划.

  • 状态定义: 设 d p [ i ] dp[i] dp[i] 代表第 i 个台阶所花费的总费用.
  • 状态方程: d p [ i ] = m i n ( d p [ i − 1 ] , d p [ i − 2 ] ) + c o s t [ i ] dp[i]=min(dp[i-1],dp[i-2])+cost[i] dp[i]=min(dp[i1],dp[i2])+cost[i].
  • 初始状态: d p [ 0 ] = c o s t [ 0 ] , d p [ 1 ] = c o s t [ 0 ] dp[0]=cost[0],dp[1]=cost[0] dp[0]=cost[0],dp[1]=cost[0].
  • 返回值: m i n ( d p [ n − 1 ] , d p [ n − 2 ] ) min(dp[n-1],dp[n-2]) min(dp[n1],dp[n2]).

代码:

int minCostClimbingStairs(vector<int>& cost) {
	int len = cost.size();
	vector<int> dp(len, 0);
	dp[0] = cost[0], dp[1] = cost[1];
	for (int i = 2; i < n; i++) {
		dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
	}
	return min(dp[i - 1], dp[i - 2]);
}

198. 打家劫舍

题目: 小偷对一排屋子进行偷窃,只能偷不相邻的房子,请问最高可以偷多少钱.
思路: 动态规划.

  • 状态定义: 设 d p [ i ] dp[i] dp[i] 代表偷前 i 个房子的最大金额.
  • 状态方程: d p [ i ] = m a x ( d p [ i − 1 ] , d p [ i − 2 ] + n u m s [ i ] ) dp[i]=max(dp[i-1],dp[i-2]+nums[i]) dp[i]=max(dp[i1],dp[i2]+nums[i]).
  • 初始状态: d p [ 0 ] = 0 , d p [ 1 ] = n u m s [ 0 ] dp[0]=0,dp[1]=nums[0] dp[0]=0,dp[1]=nums[0].
  • 返回值: d p [ i ] dp[i] dp[i].

代码:

int rob(vector<int>& nums) {
	int len = nums.size();
	vector<int> dp(len + 1, 0);
	dp[0] = 0, dp[1] = nums[0];
	for (int i = 2; i <= len; i++) {
		dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
	}
	return dp[len];
}

你可能感兴趣的:(leetcode,算法)