DP之钢管切割,最长回文字符串,最长公共子串
在做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之钢管切割,最长回文字符串,最长公共子串相关推荐
- leetCode第五题-求字符串最长回文字符串
原题链接: 最长回文字符串 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad" 输出:"bab" 解释:"ab ...
- 最长回文字符串——马拉车(Manacher)算法
最长回文字符串--马拉车(Manacher)算法 说来惭愧,都快要毕业了才写第一篇博客... 回文串 回文串呢,就是在一个字符串中,左半部分和右半部分是镜像对称的字符串,比如abcba,就是一个已c为 ...
- jsp判断字符串相等_最长回文字符串三种解法
先解释一下什么是回文字符串,比如说字符串"aba",无论是从先往后读取还是从后往前读取,结果都是一样的.当给定很长的字符串时,如何快速获取到最长的回文字符串,这也是大厂比较常见的算 ...
- Java Longest Palindromic Substring(最长回文字符串)
假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padro ...
- 转载-----Java Longest Palindromic Substring(最长回文字符串)
转载地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic st ...
- python生成回文字符串_回文字符串最长回文子串和子序列 - Python
Palindrome 回文字符串就是指从前往后和从后往前读,都是一样的,比如"aabcbaa". 注意区分子串和子序列,子串是连续的,子序列可以不连续 题型1:判断字符串是否为回文 ...
- hdu 3068 最长回文(manacheramp;最长回文子串)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- leetcode_最长回文字符串
题目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum le ...
- [转]最长回文字符串
最长回文串 输入一个字符串,求出其中最长的回文字串.字串的含义是:在原串中连续出现的字符串片段.回文的含义是:正着看和倒着看相同,如aabb和yyxyy,字判断时,应该忽略所有标点符号和空格,且忽略大 ...
最新文章
- javascript修改CSS
- 数据资产纳入国资保值增值考核
- 迁移 WinForm 应用从 dotnet framework 到 dotnetcore3.0
- fatal error C1083:无法打开包括文件:“stdint.h”: No such file or directory解决方案
- linux下安装在线mysql,嵌入式 Linux下安装Mysql离线和在线安装
- 浅谈大比例尺数字地形图的缩编方法
- 【LOJ3058】【HNOI2019】白兔之舞
- Unity鼠标手势滑动
- python中计算排列组合的函数_Python实现的排列组合计算操作示例
- 陈庆平获评2021年湖南省“最美科技工作者”
- Java绘制图形(正方形/三角形/圆/网以及填充颜色)
- 四羧基锌酞菁(ZnC4Pc),Zn-taPc 酞菁类化合物,齐岳生物供应酞菁材料
- 叶公好龙——存在与逻辑
- 实战演练--保存QQ账号与密码
- 达达财报:赚钱与烧钱的平衡大考
- 计算机一级考试空格符号选择题,2018年9月计算机一级考试MSOffice练习题二
- qt + osg 根据高程变色之 渐变色
- depends-on的用法
- 二级MySQL数据库程序设计(一)
- grace星载接收机数据获取
热门文章
- 中国移动利润大幅上涨后,降低5G套餐,却悄悄提高固网宽带价格
- rails网站开发所使用的插件收集---web开发工具集
- 搭建一个STC8H的最小系统
- NUCLEO-STM32H7A3ZI-Q使用说明
- ORACLE 行迁移 chained_rows分析
- 【CSDN|每日一练】吃!吃!吃!
- jk+apache+tomcat整合 总结
- 例说linux内核与应用数据通信(三):读写内核设备驱动文件
- 基于css简易实现头像更换动画效果
- 19、angular1之pass-word组件、input-select组件 、only-select组件(两种)、on-off组件、layui中的datetime示例、京东购物车、两种作用域绑定、