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

代码随想录算法训练营day43|动态规划part10

今天的是子序列问题,第二题难度不大,可以采用类似贪心的思路求解。第一题的思想比较新颖,注意dp[i]是以i为末尾元素的最长递增子序列,可以用两层循环,第二层循环遍历从0到i-1,通过不断更新dp[i]的值求解最长递增子序列,这里的思路很巧妙。

另外,第一题还可以用贪心的方法,要使子序列尽可能长,就要使每个子序列中的数尽可能小,若遇到更小的数就将其替换。可以写出如下代码:

 for(auto num:nums){
            auto it=ranges::lower_bound(res,num);
            if(it==res.end()) {
                res.push_back(num);
            }
            else *it=num;
        }
        return res.size();

第三题的思路和第一题类似,

   vector<vector<int>>dp(nums1.size(),vector<int>(nums2.size(),0));
//dp[i][j]表示以nums1[i],nums2[j]为末尾元素的最长子序列的长度,需要初始化为0
 if(nums1[i]==nums2[j]&&i>0&&j>0) dp[i][j]=dp[i-1][j-1]+1;

这行代码的意思是如果两个数列有数字相同,就在前面的基础上加1,因为两个数列是同步的。

这道题卡哥采用的是i-1,j-1的写法,我认为用i,j更容易理解,只是需要多一步初始化的过程同时要防止数组越界:

 for(int i=0;i<nums1.size();i++) if(nums1[i]==nums2[0])dp[i][0]=1;
        for(int j=0;j<nums2.size();j++) if(nums2[j]==nums1[0]) dp[0][j]=1;

先处理完第一行,再处理后面的。


http://www.kler.cn/a/441473.html

相关文章:

  • java常量池
  • 期权帮|在股指期货中超过持仓限额怎么办?
  • 【C++基础】多线程并发场景下的同步方法
  • Ansys Motor-CAD:IPM 电机实验室 - 扭矩速度曲线
  • 运算放大器应用电路设计笔记(六)
  • Android SystemUI——通知栏构建流程(十六)
  • MR30分布式IO模块,为港口岸桥安全增效保驾护航
  • 路径规划之启发式算法之十七:淘金优化算法(Gold Rush Optimizer, GRO)
  • 基于Spring Boot的体育商品推荐系统
  • 大数据与AI:从分析到预测的跃迁
  • Webpack中loader的作用/ loader是什么?
  • Halcon面试题及参考答案
  • Qt读写文本文件
  • 【Spring 全家桶】Spring MVC 快速入门,开始web 更好上手(下篇) , 万字解析, 建议收藏 ! ! !
  • 通过gateway实现服务的平滑迁移
  • 登陆harbor发现证书是错误的, 那么如何更新harbor的证书呢
  • 深入解析Ubuntu 20.04 ROS中的setup.bash文件
  • OPC UA、MQTT 和 HTTP性能分析及使用场景推荐
  • Linux shell脚本练习(三)
  • gateway 微服务的入口-笔记
  • opencv实战--颜色识别
  • 数据结构day3作业
  • Python 写的《桌面时钟》屏保
  • React自学:如何使用localStorage,以及如何实现删除笔记操作
  • docker-4.迁移存储目录
  • 04 条件渲染