动态规划算法

  • 1、目标
  • 2、方法
  • 3、过程
  • 4、例题
    • (1)[力扣:5. 最长回文子串](https://leetcode-cn.com/problems/longest-palindromic-substring/)
    • (1)[力扣:1018. 可被 5 整除的二进制前缀](https://leetcode-cn.com/problems/binary-prefix-divisible-by-5/)

1、目标

是求解决策过程最优化的过程。

2、方法

把原问题分解成子问题进行求解,也就是分治的思想。

3、过程

主要分四步:

  1. 划分子问题:把一个大问题分解为小问题
  2. 状态表示:如何处理小问题。
  3. 状态转移:也就是父问题如何推导出子问题。
  4. 确定边界:确定初始状态是什么?最小的子问题?最终状态又是什么。

4、例题

(1)力扣:5. 最长回文子串

class Solution {public:string longestPalindrome(string s) {int length = s.length();vector<vector<bool>> answer(length, vector<bool>(length));int Start = 0,End = 0;//自己与自己的关系全部设为true,也就是只有一个的情况for(int i = 0;i < length;i++){answer[i][i] = true;}//开始进行遍历,达到条件的就改成truefor(int j = 1;j < length;j++){for(int i = 0;i < j;i++){if(s.at(i) == s.at(j) &&(i+1 == j || answer[i+1][j-1])){if(j - i >= End - Start){Start = i;End = j;}answer[i][j] = true;}}}return s.substr(Start,(End - Start + 1));}
};

ps:我在刷这一部分题的时候遇见的问题很大,做起来很困难,唉。

(1)力扣:1018. 可被 5 整除的二进制前缀

打个比方[0,1,1,1],第一个数是0,第二个数是01,第三个是011,第四个是0111,化为十进制,分别为0,1,3,7.然后根据二进制规则,数据每向左移动一位,数据大小乘2.
那么可以用sum = 0, sum = sum *2 + num。num就是[0,1,1,1]里的元素,sum就是化成的十进制。

class Solution {public:vector<bool> prefixesDivBy5(vector<int>& A) {vector<bool> a;int sum = 0;for(auto num : A){sum = sum * 2 +num;cout<<sum % 5<<endl;if(sum % 5 == 0) a.push_back(1);else if(sum % 5 != 0 ) a.push_back(0);}return a;}
};

然后运行超时了所以我准备改造一下
首先sum*2我们可以改造成sum<<1,直接改成二进制移动位置,然后可以让sum等于之前sum留下的余数

class Solution {public:vector<bool> prefixesDivBy5(vector<int>& A) {vector<bool> a;int sum = 0;for(auto num : A){sum = (sum << 1) +num;a.push_back(sum % 5 == 0);    }return a;}
};

然后又报错int类型的数据的存储空间不够,那就想办法让int存的小一点.

class Solution {public:vector<bool> prefixesDivBy5(vector<int>& A) {vector<bool> a;int sum = 0;for(auto num : A){sum = ((sum << 1) +num) %5;a.push_back(sum == 0);    }return a;}
};

每次sum都除一下5让sum只等于他的余数,因为多余的数怎么也是五的倍数,关键就是看余出来的这一部分数据能够怎么处理。

C++算法学习(动态规划算法)相关推荐

  1. 数据结构与算法学习⑥(动态规划 题解 背包和打家劫舍问题)

    数据结构与算法学习⑥(动态规划 动态规划 1.初识动态规划 1.1.从贪心说起 1.1.1.贪心的特点 1.1.2.贪心的局限性 1.1.3.贪心失效后怎么办 1.1.4.从最优化问题到递归 1.2. ...

  2. 算法学习--排序算法--插入排序

    算法学习--排序算法--插入排序 插入排序算法 代码实现 插入排序算法 插入排序(Insertion sort)是一种简单直观且稳定的排序算法.如果有一个已经有序的数据序列,要求在这个已经排好的数据序 ...

  3. php算法学习,php算法学习之动态规划

    动态规划程序设计是对解最优化问题的一种途径.一种方法,最终问题的最优解可以通过前面子问题的最优解推导出来. 对于动态规划这个算法,自己学习的还不是很透彻,简单的总结自己学习的感受是: 动态规划思想中融 ...

  4. 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...

    一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...

  5. 智能汽车路径规划学习-动态规划算法、A*算法

    动态规划算法 动态规划时运筹学的一个分支,是求解多阶段决策过程最优问题的数学方法. 各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展.当各个阶段的决策确定后,就组成了一个决策 ...

  6. 算法学习--动态规划与贪心算法

    动态规划与贪心算法都是一种递推算法,都是用局部最优解来推导全局最优解:是对遍历解空间的一种优化:当问题具有最优子结构时,可以用动态规划来解决,而贪心算法是动态规划的特例 动态规划 1. 动态规划的思想 ...

  7. 算法学习-动态规划(二)

    文章目录 问题一:四维动态规划 算法伪代码 时间复杂度分析 问题二:类似矩阵链乘 算法伪代码 算法时间复杂度 问题三 问题四 算法伪代码 问题五 算法伪代码 问题五 问题六 问题七 问题一:四维动态规 ...

  8. 算法之动态规划算法简介

    动态规划概述 算法,是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.在现实生活中,算法具有如下一些特征: 有穷性:指算法必须能在执行有限个步骤 ...

  9. 【C语言】算法学习·回溯算法

    目录 一.全排列问题 二.N 皇后问题 三.最后总结 回溯算法基本框架 解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也 ...

最新文章

  1. 解决解码H264视频黑屏问题
  2. 插入函数c语言,线性表的插入函数
  3. 基于Docker搭建RabbitMQ(多图)
  4. 三张表有重复字段_什么?搞不定Kafka重复消费?
  5. Foxmail新建自动标签功能在哪 如何给Foxmail收件人邮件设置自动标签
  6. Longhorn明年5月完成 微软将推7个版本
  7. Java语言基础(2)
  8. ExtJS视频教程 ExtJS入门到精通教程下载
  9. 史上最新最全面的java大数据学习路线(新手小白必看版本)
  10. 抖音互关源码 E4A源码含数据库后台程序搭建可用
  11. 新型博客网站的运营要素分析
  12. UTF-8和utf8的区别
  13. UNICODE与 UTF-8的转换详解
  14. c51数字钟c语言程序,51单片机电子时钟C语言程序
  15. 项目管理-常见工具和技术总结
  16. 厦门大学2022年计算机考研复试流程
  17. 云南小学、初中、高中标准教学实验室设备配置清单整体解决方案
  18. 盘点几款还不错的企业网盘产品
  19. jQuery简单实线钟表并随机钟表数字颜色
  20. C++引用实现函数传递数据

热门文章

  1. 想交换机高级篇的朋友们,你们有福啦
  2. 线性表--算法设计题2.25
  3. 【重点】剑指offer——面试题62:序列化二叉树
  4. 【React】JSX
  5. 【计数网络】梯度累加增加LCFCN的BatchSize
  6. 高并发与负载均衡-nginx-反向代理概念
  7. 2018阿里-研发工程师JAVA Software Engineer, Java
  8. CMakeFiles/species.inc.dir/build.make:57: recipe for target 'CMakeFiles/species.inc' failed
  9. 取消Eclipse的自动代码格式化
  10. 人生五大投资,你投对了几个?