跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

思路

根据题目意思,最大跳跃距离,说明可以跳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动态规划--基础题的更多相关文章

  1. nyist oj 79 拦截导弹 (动态规划基础题)

    拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 某国为了防御敌国的导弹突击.发展中一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以 ...

  2. LeetCode 94 | 基础题,如何不用递归中序遍历二叉树?

    今天是LeetCode专题第60篇文章,我们一起来看的是LeetCode的94题,二叉树的中序遍历. 这道题的官方难度是Medium,点赞3304,反对只有140,通过率有63.2%,在Medium的 ...

  3. leetcode 动态规划类型题

    1,Triangle int mininumTotal(vector<vector<int>>& triangle) { ; i >= ; --i) { ; j ...

  4. LeetCode 第70题动态规划算法

    导言 看了 动态规划(https://www.cnblogs.com/fivestudy/p/11855853.html)的帖子,觉得写的很好,记录下来. 动态规划问题一直是算法面试当中的重点和难点, ...

  5. 快速上手leetcode动态规划题

    快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了 ...

  6. [LeetCode] 系统刷题5_Dynamic Programming

    Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题 ...

  7. leetcode top-100-liked-questions刷题总结

    一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...

  8. leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  9. leetcode第37题--Count and Say

    题目:(据说是facebook的面试题哦) The count-and-say sequence is the sequence of integers beginning as follows:1, ...

随机推荐

  1. linux运维中经常使用的目录和文件讲解

    第9章 linux中目录结构 9.1 linux中的常见目录和解释说明 ID 目录 说明 1 bin 命令文件保存的地方 2 sbin 只有root用户才可以使用的命令 3 Boot(了解即可) Li ...

  2. Mybatis 报错 java.lang.IllegalArgumentException: Result Maps collection does not contain value for java.lang.Inte

    like ‘%java.lang.IllegalArgumentException: Result Maps collection does not contain value for java.la ...

  3. 关于《iBoard 电子学堂》的学习及进阶方式(精 转)

    关于<iBoard 电子学堂>的学习及进阶方式 <iBoard 电子学堂>自发布以来,受到广大网友的热烈关注.虽然我前期设计我花了大量精力,但能得到大家的认可,我也非常欣慰.由 ...

  4. 工具类中注入service和dao

    今天编写了个工具类需要用到service成和dao层的代码 如下: //第一步:需要将工具类注入到容器中 @Component public class RuleUtils { ​ //第二部注入 @ ...

  5. 【JS】379- 教你玩转数组 reduce

    reduce 是数组迭代器(https://jrsinclair.com/articles/2017/javascript-without-loops/)里的瑞士军刀.它强大到您可以使用它去构建大多数 ...

  6. HashMap面试必问的6个点,你知道几个?

    一.HashMap的实现原理? 此题可以组成如下连环炮来问 你看过HashMap源码嘛,知道原理嘛? 为什么用数组+链表? hash冲突你还知道哪些解决办法? 我用LinkedList代替数组结构可以 ...

  7. android studio 项目生成的apk变小的原因

    问题:感觉直接在apk文件夹下面拷出来的apk不能安装使用,而且apk比较小,可能就是这个问题引起的 Android Studio版本升级到2.3后,增加了instant run功能,对项目的buil ...

  8. 多线程之美5一 AbstractQueuedSynchronizer源码分析<一>

    AQS的源码分析 目录结构 1.什么是CAS ? 2.同步器类结构 3.CLH同步队列 4.AQS中静态内部类Node 5.方法分析 ​ 5.1.acquire(int arg ) ​ 5.2.rel ...

  9. ssm集成(maven)& 分模块开发--详细教程

    1 maven版本的ssm 1.1 最简单的版本步骤: (1) 创建maven web项目 (2) 在pom.xml中导入依赖的jar包 (3) 再写配置文件: web.xml <!DOCTYP ...

  10. vue集成cesium,webgis平台第一步(附源码下载)

    vue-cesium-platform Vue结合Cesium的web端gis平台 初步效果 笔记本性能限制,运行Cesium温度飙到70度以上.所以平时开发时先开发界面,之后加载Cesium地球 当 ...