子序列與子串問題總結
1、最長遞增子序列
擴充套件:雙端LIS
題目:從一列數中篩除儘可能少的數使得從左往右看,這些數是從小到大再從大到小的。
該題是網易遊戲的筆試題,是一個典型的LIS變形,思路就是利用LIS計算兩個陣列B,C。其中B[i]表示從左向右以i結尾的最長遞增子序列,C[i]表示從右向左n~i的最長遞增子序列,即i~n的最長遞減子序列,所以以data[i]作為最高點需要去掉的數字為n-B[i]-C[i]+1,具體程式碼如下:
#include<iostream>
#include<vector>
using namespace std;
int DoubleEndLIS(vector<int> data)//當然也可以使用O(nlogn)的演算法
{
int length = data.size(),i,j,res = length;
if(length == 0)return 0;
vector<int> B(length,1),C(length,1);
for(i = 0;i < length;++i)//從左向右
{
for(j = 0;j < i;++j)
{
if(data[j] < data[i] && B[j]+1 > B[i])B[i] = B[j]+1;
}
}
for(i = length-1;i >= 0;--i)//從右向左
{
for(j = length-1;j > i;--j)
{
if(data[j] < data[i] && C[j]+1 > C[i])C[i] = C[j]+1;
}
}
for(i = 0;i < length;++i)
{
if(length - B[i] - C[i] + 1 < res)res = length - B[i] - C[i] + 1;
}
return res;
}
int main()
{
int n,i;
while(cin >> n)
{
vector<int> data(n);
for(i=0;i < n;++i)cin >> data[i];
cout << DoubleEndLIS(data) << endl;
}
}
2、最長公共子序列
3、最長公共子串
4、最長公共字首
5、最近公共祖先
7、最長不重複子串
相關文章
- [LeetCode解題] -- 動態規劃二 [ 子串、子序列問題 ]LeetCode動態規劃
- 不同的子序列問題I
- 一類子樹問題的總結
- 滑動視窗法——子串相關問題
- 子串位置
- 雙子串最大異或 題解
- 最長子串
- 子串查詢
- 動態規劃求解最長上升子序列問題動態規劃
- 最長公共子序列問題—動態規劃sdut動態規劃
- 8.3考試總結(NOIP模擬19)[最長不下降子序列·完全揹包問題·最近公共祖先]
- 最長上升子串
- 子串匹配 BF法
- 程式碼隨想錄day46 || 647 迴文子串, 516 最長迴文子序列
- 動態規劃經典問題----最長公共子序列動態規劃
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 30串聯所有單詞的子串
- 子段和問題
- 電力電子技術簡答題總結
- lCS(最長公共子串)
- 04.子串,啟動!
- LeetCode題集-5 - 最長迴文子串(一)LeetCode
- 用滑動視窗來解決最長無重複子串問題
- 無重複字元的最長子串問題 (移動視窗法求解)字元
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 【每日一題】無重複字元的最長子串每日一題字元
- 牛客網 Coincidence(最長公共子串LCS板題)IDE
- Amazon面試題:尋找最長迴文子串面試題
- 牛客題霸 [最長公共子串]C++題解/答案C++
- Python小技巧 - 子串查詢Python
- [NOIP2015 提高組] 子串
- 76. 最小覆蓋子串
- Python找回文子串的方法Python
- java 最長迴文子串Java
- java B2B2C Springcloud電子商城系統-Spring Cloud常見問題與總結(四)JavaSpringGCCloud
- 最長上升子序列
- 最長公共子序列
- 領釦LintCode演算法問題答案-77. 最長公共子序列演算法
- lc1771 由子序列構造的最長迴文串的長度