几种最基础的字符串动态规划讲
来源:互联网 发布:软件行业前景预测 编辑:程序博客网 时间:2024/06/05 18:53
最大连续子序列和 直接扫一遍,判断当前数和(之前的累加和这个数之和)哪个大,应该是扫掉负数。
最长不下降子序列(和上个不一样,这个可以不连续)(LIS)
这个问题求的是数量,不下降的数量。因为每个状态都有2种选择,所以正常暴力的复杂度是2的阶数级,用DP转化n2。
方法:
二重循环,从头扫到这个变量。
1 6 4
dp[i] i=1 和 i=2 都是2;
存的是当前位置的最大不下降序列和。
dp[i]=max{1,dp[j]+1} (j=1,2,....,i-1 && A[j]<A[i])
没有就是1
这个问题求的是数量,不下降的数量。因为每个状态都有2种选择,所以正常暴力的复杂度是2的阶数级,用DP转化n2。
方法:
二重循环,从头扫到这个变量。
1 6 4
dp[i] i=1 和 i=2 都是2;
存的是当前位置的最大不下降序列和。
dp[i]=max{1,dp[j]+1} (j=1,2,....,i-1 && A[j]<A[i])
没有就是1
最长公共子序列(LCS)
求的是两个字符串最长公共部分的长度(可以不连续)
PS:子序列可以不连续,但是子串是要求连续的
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1
else dp[i][j]=max(dp[i-1][j],dp[i][j-1])
else dp[i][j]=max(dp[i-1][j],dp[i][j-1])
PS:dp[i][j] 表示第一个串前i位和第二个串前j位的LCS。
如果接下来比较这位相同,那么这个dp相当于之前那个dp记录加1.
不相同的话 为这个i-1 j和 i j-1 这两个串中LCS较大那个。
如果接下来比较这位相同,那么这个dp相当于之前那个dp记录加1.
不相同的话 为这个i-1 j和 i j-1 这两个串中LCS较大那个。
最长回文字串
PS:注重这个问题的边界问题,这个边界和上面几个不太一样。
枚举子串的长度,然后一个一个长度带进去试。(这里我们从3开始)
这里dp[i][j]只有2个值,0,1,用来判断是还是不是。
if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1] //要是这个数相等,就看比它短一段的字符串是不是对称,短的是这个就对称,不然就不对称。
else dp[i][j]=0 //不相等直接等于0
边界处理:
PS:长度要从3开始,毕竟每次都减少2个。
先把长度为1的dp值全部设置成1。
然后判断长度为2的串。有的话ans=2;
前两步在一个for循环完成。
然后dp就好了。
阅读全文
0 0
- 几种最基础的字符串动态规划讲
- 动态规划基础讲
- 强化学习基础 第二讲 基于模型的动态规划算法
- 强化学习基础 第二讲 基于模型的动态规划算法
- 暗黑的字符串-动态规划
- 动态规划的基础模板
- 禁止字符串 字符串上的动态规划
- 动态规划 -- 动态规划基础
- 动态规划选讲 8.15
- 动态规划之背包问题,最基础的动态规划
- 动态规划第三讲——序列化的动态规划问题
- 动态规划第五讲——leetcode上的题目动态规划汇总(上)
- 动态规划第六讲——leetcode上的动态规划汇总(下)
- 动态规划第三讲——序列化的动态规划问题
- 动态规划第五讲——leetcode上的题目动态规划汇总(上)
- 动态规划第六讲——leetcode上的动态规划汇总(下)
- 动态规划 - 字符串的编辑距离
- 跟字符串有关的动态规划算法
- linux基础学习1
- CodeForces 883C
- POJ 1324 BFS+状态压缩 蛇走迷宫
- 二叉树的镜像
- Android中TextView通过换行实现条目布局
- 几种最基础的字符串动态规划讲
- JVM(java 虚拟机)内存设置
- Binary Search:222. Count Complete Tree Nodes
- 【入门篇】Activiti流程部署两种方法
- 物联网的体系结构和关键技术
- Python负数下标
- 013day(学习有关一维数组的部分知识)
- C#中Abstract和Virtual
- Custom Gradients in TensorFlow