leetcode动态规划--基础题
跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
思路
根据题目意思,最大跳跃距离,说明可以跳0--nums[i]的距离
可以把跳跃看成走nums[i]步,如果能走到下一位置则可以加油获取更多的步数(nums[j]步),但是不能累加
那么只需扫一遍nums数组,更新剩余能跳的距离(注意不能累加,只能取最大!)
到终点之前判断是否有剩余步骤即可
代码
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()==0)return false;
int cur=nums[0];
for(int i=1;i<nums.size();++i){
if(cur<=0){
return false;
}
cur--;
cur=std::max(cur,nums[i]);
}
return true;
}
};
不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?

思路
当前位置可以来自上方或者左边
令dp[i][j]表示第i行第j列的路径数,则dp[i][j]=dp[i-1][j]+dp[i][j-1];
注意边界即可
代码
class Solution {
public:
int uniquePaths(int m, int n) {
int path[m+1][n+1];
memset(path,0,sizeof(path));
path[0][1]=1;
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
path[i][j]=path[i-1][j]+path[i][j-1];
}
}
return path[m][n];
}
};
零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
思路
一开始想法是搜索,但是超时了(大概是我太菜了吧)
接着想到每一中硬币选的个数最多为amount / coins[i]
接着就是将其转化为0/1背包问题求解
dp[i][j]表示前i个硬币组成金额 j 的最少硬币个数
dp[i][j] = min(dp[i-1][j-k*coins[i]) , 0<=k<=j/coins[i];
代码
代码写的太丑了
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if(coins.size()==0)return -1;
int cn=coins.size();
int dp[cn+1][amount+1];
for(int i=0;i<=cn;++i){
for(int j=0;j<=amount;++j){
dp[i][j]=-1;
}
}
for(int i=0;i<=cn;++i){
dp[i][0]=0;
}
// 第一个硬币
for(int i=1;i<=amount;++i){
if(i%coins[0]==0){
dp[0][i]=i/coins[0];
}
}
for(int i=1;i<cn;++i){
for(int j=0;j<=amount;++j){
// 第i枚硬币选择k个
for(int k=0;k*coins[i]<=j;++k){
if(dp[i-1][j-k*coins[i]]!=-1){
if(dp[i][j]==-1){
dp[i][j]=dp[i-1][j-k*coins[i]]+k;
}else{
dp[i][j]=min(dp[i][j],dp[i-1][j-k*coins[i]]+k);
}
}
}
}
}
return dp[cn-1][amount];
}
};
Longest Increasing Subsequence
最长上升子串
思路
令dp[i]表示以nums[i]作为结尾的最大上升子序列的最大长度
内层循环在前面找比nums[i]小的元素,可以将nums[i]接到j后面使得LIS长度加1
dp[i] = max(dp[j]+1) ,nums[i]>nums[j]&&0<=j<i;
注意最后返回dp的最大值
代码
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0||nums.size()==1)return nums.size();
int dp[nums.size()];
for(int i=0;i<nums.size();++i){
dp[i]=1;
}
int ans=-1;
for(int i=0;i<nums.size();++i){
for(int j=0;j<i;++j){
if(nums[i]>nums[j]){
dp[i]=std::max(dp[i],dp[j]+1);
}
}
ans=std::max(ans,dp[i]);
}
return ans;
}
};
leetcode动态规划--基础题的更多相关文章
- nyist oj 79 拦截导弹 (动态规划基础题)
拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 某国为了防御敌国的导弹突击.发展中一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以 ...
- LeetCode 94 | 基础题,如何不用递归中序遍历二叉树?
今天是LeetCode专题第60篇文章,我们一起来看的是LeetCode的94题,二叉树的中序遍历. 这道题的官方难度是Medium,点赞3304,反对只有140,通过率有63.2%,在Medium的 ...
- leetcode 动态规划类型题
1,Triangle int mininumTotal(vector<vector<int>>& triangle) { ; i >= ; --i) { ; j ...
- LeetCode 第70题动态规划算法
导言 看了 动态规划(https://www.cnblogs.com/fivestudy/p/11855853.html)的帖子,觉得写的很好,记录下来. 动态规划问题一直是算法面试当中的重点和难点, ...
- 快速上手leetcode动态规划题
快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了 ...
- [LeetCode] 系统刷题5_Dynamic Programming
Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题 ...
- leetcode top-100-liked-questions刷题总结
一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...
- leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- leetcode第37题--Count and Say
题目:(据说是facebook的面试题哦) The count-and-say sequence is the sequence of integers beginning as follows:1, ...
随机推荐
- Selenium之xpath绝对路径表示法
xpath写法: 绝对路径:以/开始,逐个增加节点用/分割 特点:不能跨级.类似css中的直接子元素选择器 相对路径:用两个斜杠 // 如 //div//p//a 通配符:xpath也有 ...
- 为什么HashMap的加载因子是0.75?
说在前面 在HashMap中,默认创建的数组长度是16,也就是哈希桶个数为16,当添加key-value的时候,会先计算出他们的哈希值(h = hash),然后用return h & (l ...
- Vue-兄弟组件传值
学习博客:https://www.jianshu.com/p/b10b3ac3729a
- 【Maven】常用命令
[Maven]常用命令 转载:https://www.cnblogs.com/yangchongxing/p/10267028.html Maven Jar 搜索:https://mvnreposit ...
- Django序列化时间报错
一.前言 当利用models模块从数据库获取数据时,当获的取数据序列化时,如果获取的数据中有关于时间类型的字段,则会报错,错误如下: TypeError: datetime.datetime(2018 ...
- python故障排除
在初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...
- 人生苦短,我用Python(2)
1.for循环遍历字符串: string="人生苦短,我用Python" print(string) for ch in string: print(ch) for 循环语句还可以 ...
- Litho在美团动态化方案MTFlexbox中的实践
1. MTFlexbox MTFlexbox是美团内部应用的非常成熟的一种跨平台动态化解决方案,它遵循了CSS3中提出的Flexbox规范来抹平多平台的差异.MTFlexbox适用于重展示.轻交互的业 ...
- CSS类的操作
CSS类的操作 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- linux vscode 编译配置
linux 环境下,g++和clang都可以作为C++的编译器,我这里选择使用的是clang. 首先是插件选择: (1) C/C++ 微软自带的C/C++插件. (2) C/C++ Clang Com ...