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

东莞莞城网站建设b站视频推广网站400

东莞莞城网站建设,b站视频推广网站400,二维码怎么制作,免费分销平台有哪些恭喜你刷到博主 DP 经典题目详解部分第一期,想学好 DP 请关注订阅,会持续更新!!!!! 建议先阅读DP算法入门 00001 最长递增子序列(Longest Increasing Subsequence,简写…

恭喜你刷到博主 DP 经典题目详解部分第一期,想学好 DP 请关注订阅,会持续更新!!!!!

建议先阅读DP算法入门

00001 最长递增子序列(Longest Increasing Subsequence,简写 LIS)

提要:本文介绍两种算法实现

一种是动态规划(算法复杂度 O(n ^ 2)):

通过本题了解设计动态规划的通用技巧 ————> 数学归纳思想

一种是二分查找(算法复杂度 O(n log n)):

由 patience game 的纸牌游戏(甚至有一种排序方法就叫做 patience sorting(耐心排序))的思想衍生的算法

01 动态规划

假设这个结论在 k < n 时成立,然后想办法证明 k = n 的时候此结论也成立。如果能够证明出来,那么就说明这个结论对于 k 等于任何数都成立类似的,我们设计动态规划算法,不是需要一个 dp 数组吗?我们可以假设 dp[0...i - 1] 都已经被算出来了,怎么通过这些结果算出 dp[i]?

首先要定义清楚 dp 数组的含义,即 dp[i] 的值到底代表着什么?

我们的定义是这样的:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度

重申一遍 DP 框架

明确状态 -> 定义 dp 数组/函数的含义 -> 明确选择-> 明确 base case
int lengthOfLIS(vector<int> &nums)
{if (nums.empty())return 0;int n = nums.size();//dp 数组应该全部初始化为 1,因为子序列最少也要包含自己,所以长度最小为 1vector<int> dp(n, 1); // 填充 dp 数组for (int i = 1; i < n; ++i){//找到前面那些结尾比 i 小的子序列,然后把 i 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加 1for (int j = 0; j < i; ++j){if (nums[i] > nums[j]){dp[i] = max(dp[i], dp[j] + 1);}}}// 寻找 dp 数组中的最大值即找最长递增子序列int res = 0;for (int i = 0; i < n; ++i){res = max(res, dp[i]);}return res;
}

10 二分查找

首先我们玩下叫 patience game 的纸牌游戏

规则:他的实现原理就是首先使用数组中的第一个数字创建一个纸牌堆,然后逐个读取数组中的剩余数字,如果当前数字比所有纸牌堆中最上面的数字都大,就新建一个纸牌堆,把当前数字放到该堆中。否则找到一个最上面数字不小于当前数字的纸牌堆,把当前数字放到该纸牌堆中

1

1

1

1

1

1

1


我们只要把处理扑克牌的过程编程写出来即可。每次处理一张扑克牌不是要找一个合适的牌堆顶来放吗?牌堆顶的牌不是有序吗?

———> 用到二分查找了:搜索当前牌应放置的位置



int LIS(vector<int> &nums)
{if (nums.empty())return 0;vector<int> top; // 用于存储牌堆的顶端元素for (int poker : nums){// 二分查找,找到比 poker 大的最小位置auto it = lower_bound(top.begin(), top.end(), poker);// 如果没有找到合适的位置,说明 poker 应该作为新的牌堆加入if (it == top.end()){top.push_back(poker);}else{// 否则,更新找到的位置*it = poker;}}// 牌堆数即为 LIS 长度return top.size();
}

这里的二分查找直接用了 STL 算法库中的 lower_bound (因为lower_bound 底层实现使用二分查找)

想要了解二分查找的实现的参考

template <typename ForwardIterator, typename T>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& val) {while (first < last) {ForwardIterator mid = first + (last - first) / 2;  // 计算中点if (*mid < val) {first = mid + 1;  // 如果 mid 小于 val,则搜索右半部分} else {last = mid;  // 如果 mid 大于或等于 val,则搜索左半部分}}return first;  // 返回第一个不小于 val 的元素
}

http://www.ritt.cn/news/18686.html

相关文章:

  • 东莞做网站it s企业网站设计服务
  • 中文编程做网站谷歌浏览器 官网下载
  • 工程承包网站有哪些深圳网络推广培训机构
  • 成都网站建设四川冠辰科技百度指数是免费的吗
  • 企业简介 网站建设百度推广中心
  • 自己做的网站地址手机怎么打不开seo推广优化多少钱
  • 网站建设扁平化网站建设公司大全
  • 四川专做餐饮的网站东莞互联网推广
  • 网站的付款链接怎么做的百度竞价有点击无转化
  • 网站名称搜索不到泉州关键词排名工具
  • 像优酷平台网站是怎么做的最新网站查询工具
  • 做百度网站每年的费用多少钱南宁seo专员
  • 如何免费建站企业网站建设方案
  • 网站设计的总结网页设计大作业
  • 网站内页收录高级seo培训
  • 政府网站群建设关键词在线查询
  • 增加网站访客排名查询
  • 官方网站建设要点seo优化评论
  • 可以免费做简历的网站南京关键词优化服务
  • 合肥做公司网站公司seowhy官网
  • 模板网站与定制网站的价格推广软文案例
  • 模版网站和语言网站网站seo优化外包顾问
  • 怎样建设一个英语网站如何网上销售自己的产品
  • 山西天镇建站哪家好技术培训学校机构
  • 门窗企业网站建设青岛seo百科
  • 公司关于网站设计公司的简介武汉大学人民医院怎么样
  • 懂得做网站还可以做什么兼职百度百家号注册
  • 做高档衣服的网站站长工具下载app
  • 武汉网站建设晨语百度怎么注册自己的店铺
  • 溧阳做网站哪家好哈尔滨最新今日头条新闻