当前位置: 首页 > news >正文

网络编程技术基础台州关键词优化服务

网络编程技术基础,台州关键词优化服务,p2p网站建设方案书,网站头部怎样做有气势什么是动态规划 对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了! 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组&a…

什么是动态规划

对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组(打印dp数组)

找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!

做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果

509 斐波那契数

题目描述

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

  • 0 <= n <= 30

题目分析

就像二叉树三部曲

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

是有方法论的

这里动规五步曲也是一样

acm模式代码

#include <iostream>
#include <vector>class Solution {
public:int fib(int n) {std::vector<int> dp(n + 1);if (n <= 0) {return 0;}else if (n == 1) {return 1;}dp[0] = 0;dp[1] = 1;for (int i = 2 ; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
};int main() {Solution sol;int n = 5;int sum = sol.fib(n);std::cout << n << "sum:" << sum << std::endl;return 0;
}

70. 爬楼梯

题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

题目分析

爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。

那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。

所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来,那么就可以想到动态规划了。

acm模式代码

#include <iostream>
#include <vector>class Solution {
public:int climbStairs(int n) {if (n <= 1) return n;std::vector<int> dp(n + 1);dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
};int main() {Solution sol;int n = 5;int sum = sol.climbStairs(n);std::cout << n << "sum:" << sum << std::endl;return 0;
}

746使用最小花费爬楼梯

题目描述

 

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

提示:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

 题目分析

  1. 确定dp数组以及下标的含义

使用动态规划,就要有一个数组来记录状态,本题只需要一个一维数组dp[i]就可以了。

dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]

对于dp数组的定义,大家一定要清晰!

  1. 确定递推公式

可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]

dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?

一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

  1. dp数组如何初始化

看一下递归公式,dp[i]由dp[i - 1],dp[i - 2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。

那么 dp[0] 应该是多少呢? 根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],那么有同学可能想,那dp[0] 应该是 cost[0],例如 cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话,dp[0] 就是 cost[0] 应该是1。

这里就要说明本题力扣为什么改题意,而且修改题意之后 就清晰很多的原因了。

新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。

所以初始化 dp[0] = 0,dp[1] = 0;

  1. 确定遍历顺序

最后一步,递归公式有了,初始化有了,如何遍历呢?

本题的遍历顺序其实比较简单,简单到很多同学都忽略了思考这一步直接就把代码写出来了。

acm模式代码

#include <iostream>
#include <vector>
#include <algorithm>class Solution {
public:int minCostClimbingStairs(std::vector<int>& cost) {std::vector<int> dp(cost.size() + 1);// dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。dp[0] = 0;dp[1] = 0;int sum = 0;for (int i = 2; i <= cost.size(); i++) {dp[i] = std::min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}// for (int i : dp) {//     std::cout << i <<  " ";// }// std::cout << std::endl;// return dp.back();return dp[cost.size()];}
};int main() {std::vector<int> count = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};Solution sol;int min =  sol.minCostClimbingStairs(count);std::cout << "sum: " << min << std::endl;
}

http://www.mnyf.cn/news/275.html

相关文章:

  • 平顶山北京网站建设南宁网站seo大概多少钱
  • visual studio2005做网站软文素材
  • 广州做韩国网站网络广告网站
  • 深圳搭建网站公司百度一下官网搜索引擎
  • 做写字楼用哪个网站更好国际实时新闻
  • 如何做博客网站百度pc版网页
  • 网页设计中滚动图片设置广州seo推广营销
  • b2b网站排名前十上海网络推广软件
  • 喀什网站建设公司seo超级外链发布
  • 网站建设与维护总结搜索引擎主要包括三个部分
  • 西安高端品牌网站建设百度搜索数据统计
  • 注册完域名后如何做网站网络安全培训最强的机构
  • 好的网站推荐一个抖音关键词排名软件
  • 巨野城乡住房建设局网站网络广告有哪些
  • jq效果较多的网站谷歌chrome浏览器下载
  • 绚丽网站如何在互联网上做推广
  • 苏州有哪些网站制作公司上海搜索seo
  • 太原网站公司竞价推广的企业
  • 360客户如何做网站推广什么是网络推广
  • 成都医院手机网站建设前端培训
  • 江门住房城乡建设厅网站互联网项目
  • wordpress搭建个人博客泸州网站seo
  • 前程无忧做一年网站多钱百度排名推广
  • 万网个人网站备案查询网页设计作品
  • 政府网站建设结构如何优化标题关键词
  • c语言自学免费网站比较有名的个人网站
  • 阜阳手机网站建设大连seo建站
  • 如何查看一个网站是用什么程序做的资源最全的网盘搜索引擎
  • 可以做网页的软件济南优化哪家好
  • 怎么做门户网站java湖南seo技术培训