跳跃游戏

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

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

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

思路

根据题目意思,最大跳跃距离,说明可以跳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. Redis中的Java分布式缓存

    为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家. 在提高应用程序的速度和性能时,每毫秒都是至关重要的.例如,根据Google的一项研究,如果网 ...

  2. MFC unicode字符集与多字节字符集 问题之彻底终结!

    Unicode 和多字节字符集 (MBCS) 支持 Visual Studio .NET 2003   有些国际市场以大字符集来使用日文和中文等语言.为了支持这些市场的编程,Microsoft 基础类 ...

  3. chrome 浏览器的使用技巧

    前端工程师大部分的工作成果都需要在浏览器中查看,使用 chrome 浏览器的频率非常高.更好更优雅地使用 chrome,将 chrome 配置成一款趁手的浏览器,将极大地提升编程效率.本文将详细介绍 ...

  4. Python异常体系结构图

  5. hdu 6318 Swaps and Inversions (线段树求逆序对数)

    Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. 《Java知识应用》Java发送邮件(QQ,163)

    1 准备 Jar包下载地址: 链接: https://pan.baidu.com/s/1kFZgWRR8yZaQH_baf6tzAg 提取码: x2e8 邮箱:授权码 2.案例: 通过QQ邮箱服务器 ...

  7. java基础面向对象总结(一)

    年底了,总结下知识点和遇到过的面试题目. 1,如何理解面相对象. ‘万物皆对象’说的没错,听起来挺反感的,问一个说一个.有些话觉得用自己的话讲出来肯俗点,但可以证明你理解了一点.我理解的是:之所以叫面 ...

  8. 利用PyCharm操作Github(二):分支新建、切换、合并、删除

      在文章利用PyCharm操作Github:仓库新建.更新,代码回滚中,我们已经学习到了如何利用PyCharm来操作Github,其中包括了一些常见的Github操作:仓库的新建.更新以及代码回滚. ...

  9. Elasticsearch 语法指南(全)

    所有的语句默认都是没有用户名和密码,如果你的 es 集群做了安全认证的话,请在每一个 crul 后面加上 -u username:password 例如: curl -u admin:123456 - ...

  10. WinForm自定义控件之DefaultValue的误解

    DefaultValue,顾名思义,默认值的意思.但这个默认值不是用来显示的,它的作用是当属性设置的值(无法代码写还是属性窗口输入)与DefaultValue相同时,会区别显示,比如其它值加粗,Def ...