在做LeetCode第3题的时候,用到了DP,但是自己对DP还是不了解,所以翻开算法导论,开始看动态规划喽,学好动态规划,走遍天下都不怕。

  • 钢管切割
    对于一根长n米的钢管,每个长度的价格不一样,对于长i米的钢管,价格为p[i],价格表如下所示:

    现在问题是,给你一根长为n的钢管,你怎么切割,使得最后总价格最高。
    比如:长度为4米的钢管,我们有8种方案,也就是对应着中间3段切不切的排列组合,所以有2^3=8种方案。(4),(1,3),(1,1,2),(1,1,1,1),(2,1,1),(2,2),(3,1),(1,2,1)。
    然后比较得出总价最高的方案。
    动态规划,意味着解决n的问题,需要解决n-1的问题,获取最优解,需要最优子方方案,也就是最优子结构:问题的最优解由相关子问题的最优解组合而成,而这些子问题可以独立求解。
    所以我们可以得到公式:r[n] = max(p[i] + r[n-i]) ,i=1 to n。
    所以自底向上的DP算法:
int dp(int a[], int n) {int *r = new int[n];r[0] = 0;int q = 0;for (int i = 1; i < n; i++) {q = 0;for (int j = i; j > 0; j--) {q = max(q,a[j] + r[i-j]);}r[i] = q;}return r[n-1];
}

3.10 最长回文子字符串
问题:给字符串s,输出最长的回文子字符串。比如‘abcdcbw’,最长回文子字符串‘bcdcb’。
思路:最好的方法是马拉车算法,但是这里希望都用DP。设dp[i][j]为Si-Sj是否回文,则dp[i][j] = (Si==Sj && dp[i+1][j-1]),dp[i][i] = true;

string longestPalindrome(string s) {int len = s.size();bool dp[len][len];dp[len][len] = {false};int longest = 0;int left = 0;for (int i = 0; i < len; i++) {for (int j = 0; j < i; j++) {dp[j][i] = (s[i] == s[j] && (dp[j + 1][i - 1] || i - j < 2));if (dp[j][i] && longest < i - j + 1) {longest = i - j + 1;left = j;}}dp[i][i] = true;}return s.substr(left,longest);}

3.27最长公共子串
思路1:BF暴力搜索。两个字符串s1,s2,比较s1[i]和s2[j],如果相等,则比较s[i+1],s[j+1],循环下去,记录开始位置和长度,最后返回。

string longestCommonSubstring(string s1,string s2) {int start;int end;int longestNum;int m = s1.size();int n = s2.size();if (m == 0 || n == 0) {return "";}for (int i = 0; i < m; i++) {int k = i;int count = 0;for (int j = 0; j < n; j++) {if (s1[k] == s2[j]) {count++;k++;}else {if (count > longestNum) {longestNum = count;start = i;end = j - 1;}break;}}}return s1.substr(start,longestNum);
}

思路2:DP动态规划。dp[i][j] 为bool型数组,表示以s1[i]和s2[j]为最后元素的子串,是否公共。dp[i][j] = (s[i] == s[j] ? dp[i-1][j-1]+1 : 0)

string longestCommonSubstring1(string s1,string s2) {int m = s1.size();int n = s2.size();vector<vector<int>> dp(m,vector<int>(n,0));int longest = 0;int end = 0;for (int i = 0; i < m; i++) {if (s1[i] == s2[0]) dp[i][0] = 1;}for (int j = 0; j < n; j++) {if (s2[j] == s1[0]) dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = (s1[i] == s2[j] ? dp[i-1][j-1]+1 : 0);if (dp[i][j] > longest) {longest = dp[i][j];end = i;}}}return s1.substr(end - longest + 1,longest);}

DP之钢管切割,最长回文字符串,最长公共子串相关推荐

  1. leetCode第五题-求字符串最长回文字符串

    原题链接: 最长回文字符串 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad" 输出:"bab" 解释:"ab ...

  2. 最长回文字符串——马拉车(Manacher)算法

    最长回文字符串--马拉车(Manacher)算法 说来惭愧,都快要毕业了才写第一篇博客... 回文串 回文串呢,就是在一个字符串中,左半部分和右半部分是镜像对称的字符串,比如abcba,就是一个已c为 ...

  3. jsp判断字符串相等_最长回文字符串三种解法

    先解释一下什么是回文字符串,比如说字符串"aba",无论是从先往后读取还是从后往前读取,结果都是一样的.当给定很长的字符串时,如何快速获取到最长的回文字符串,这也是大厂比较常见的算 ...

  4. Java Longest Palindromic Substring(最长回文字符串)

    假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padro ...

  5. 转载-----Java Longest Palindromic Substring(最长回文字符串)

    转载地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic st ...

  6. python生成回文字符串_回文字符串最长回文子串和子序列 - Python

    Palindrome 回文字符串就是指从前往后和从后往前读,都是一样的,比如"aabcbaa". 注意区分子串和子序列,子串是连续的,子序列可以不连续 题型1:判断字符串是否为回文 ...

  7. hdu 3068 最长回文(manacheramp;最长回文子串)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. leetcode_最长回文字符串

    题目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum le ...

  9. [转]最长回文字符串

    最长回文串 输入一个字符串,求出其中最长的回文字串.字串的含义是:在原串中连续出现的字符串片段.回文的含义是:正着看和倒着看相同,如aabb和yyxyy,字判断时,应该忽略所有标点符号和空格,且忽略大 ...

最新文章

  1. javascript修改CSS
  2. 数据资产纳入国资保值增值考核
  3. 迁移 WinForm 应用从 dotnet framework 到 dotnetcore3.0
  4. fatal error C1083:无法打开包括文件:“stdint.h”: No such file or directory解决方案
  5. linux下安装在线mysql,嵌入式 Linux下安装Mysql离线和在线安装
  6. 浅谈大比例尺数字地形图的缩编方法
  7. 【LOJ3058】【HNOI2019】白兔之舞
  8. Unity鼠标手势滑动
  9. python中计算排列组合的函数_Python实现的排列组合计算操作示例
  10. 陈庆平获评2021年湖南省“最美科技工作者”
  11. Java绘制图形(正方形/三角形/圆/网以及填充颜色)
  12. 四羧基锌酞菁(ZnC4Pc),Zn-taPc 酞菁类化合物,齐岳生物供应酞菁材料
  13. 叶公好龙——存在与逻辑
  14. 实战演练--保存QQ账号与密码
  15. 达达财报:赚钱与烧钱的平衡大考
  16. 计算机一级考试空格符号选择题,2018年9月计算机一级考试MSOffice练习题二
  17. qt + osg 根据高程变色之 渐变色
  18. depends-on的用法
  19. 二级MySQL数据库程序设计(一)
  20. grace星载接收机数据获取

热门文章

  1. 中国移动利润大幅上涨后,降低5G套餐,却悄悄提高固网宽带价格
  2. rails网站开发所使用的插件收集---web开发工具集
  3. 搭建一个STC8H的最小系统
  4. NUCLEO-STM32H7A3ZI-Q使用说明
  5. ORACLE 行迁移 chained_rows分析
  6. 【CSDN|每日一练】吃!吃!吃!
  7. jk+apache+tomcat整合 总结
  8. 例说linux内核与应用数据通信(三):读写内核设备驱动文件
  9. 基于css简易实现头像更换动画效果
  10. 19、angular1之pass-word组件、input-select组件 、only-select组件(两种)、on-off组件、layui中的datetime示例、京东购物车、两种作用域绑定、