- 博客(5)
- 收藏
- 关注
原创 算法学习笔记 最长公共子串
不同于最长公共子序列,最长公共子串要求的是连续的公共序列,因此状态转移方程相比于前者要简单一些,设两个字符串a[],b[],c[i][j]代表以a[i],b[j]为结尾的最长公共子串,易知若a[i]=b[j],有c[i][j]=c[i-1][j-1],若a[i]!=b[j],c[i][j]=0,取c[i][j]的最大值即为所求,代码如下:#include<iostream>...
2018-11-16 22:37:23
205
原创 算法学习笔记 最长不下降子序列LIS
仍是一道经典的动态规划问题,设原数组为a[],用数组dp[i]记录数组a中以点i为结尾的最长不下降子序列的长度,用pre[]数组来记录每一个节点在以它为结尾的最长不下降子列中的前趋,易知初始条件:dp[i]=1(每一个节点自身就是一个lis),pre[i]=-1(每一个节点自身的lis没有前趋)。可知若点i之前存在a[j]<=a[i],则dp[i]=max(dp[j]+1,dp[i])(...
2018-11-16 00:38:25
175
原创 算法学习笔记 最长公共子序列LCS
给定两个字符串,求最长公共子序列及其长度(不同于最长公共子串的是公共子串要求连续)思路:设字串为a,b 建立二维数组c用于打表,建立二维数组d,用于记录路径,其中c[i][j]表示的是a的前i个字符构成的字串和b的前j个字符构成的字串的最大公共字串的和,则分析题目得状态转移方程:若a[i]==b[j],有c[i][j]=1+c[i-1][j-1],记d[i][j]=0,如果a[i]!=b[...
2018-11-15 19:31:33
194
原创 算法学习笔记 最长子数组
最长子数组,即数组元素和最大的子数组,方法如下: 1.分治 将数组一分为二,则该最长数组有三种情况:1.在左子数组中,2.在右子数组中 3.跨越中间节点的子数组递归地解决该问题,代码如下:int add(int a[],int fro,int re){ if(fro==re) return a[fro]; int mid=(fro+re)/2; ...
2018-11-15 01:21:31
805
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人