写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~
目录
题目一:70. 爬楼梯
题目描述:
题目分析:
很基础的dp,核心公式dp[i]=dp[i-2]+dp[i-1],解释为到第n楼的方法等于到第n-1层楼的方法加上到第n-2层楼的方法,因为每次只能爬1或2个台阶。
题解代码:
class Solution {
public:
int climbStairs(int n) {
int dp[n+5];
memset(dp,0,sizeof(dp));
if(n<=2)
return n;
dp[0]=0;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++)
{
dp[i]=dp[i-2]+dp[i-1];
}
return dp[n];
}
};
题目二:198. 打家劫舍
题目描述:
题目分析:
dp,核心公式:dp[i]=max(dp[i-1],dp[i-2]+nums[i]),由于不能打劫相邻的房屋,则打劫到第i间房屋时所窃取的钱的最大值 等于 打劫到第i-1间房屋时所窃取的钱 与 打劫到第i-2间房屋时所窃取的钱加上第i间房屋的钱 的最大值。
题解代码:
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n==1)
return nums[0];
int dp[n+5];
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<nums.size();i++)
{
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[n-1];
}
};
题目三:120. 三角形最小路径和
题目描述:
题目分析:
从下往上积累最小的路径即可。
题解代码:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n=triangle.size();
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<i+1;j++)
{
triangle[i][j]+=min(triangle[i+1][j],triangle[i+1][j+1]);
}
}
return triangle[0][0];
}
};