子序列與子串問題總結
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動態規劃
- Codeforces 163A Substring and Subsequence:dp【子串與子序列匹配】
- 一類子樹問題的總結
- NOIP2015子串[序列DP]
- 大型電子政務專案問題總結薦
- 子串查詢
- 查詢子串
- 最長子串
- 動態規劃求解最長上升子序列問題動態規劃
- 最長公共子序列問題—動態規劃sdut動態規劃
- [演算法筆記]動態規劃之最長公共子串和最長公共子序列演算法筆記動態規劃
- 8.3考試總結(NOIP模擬19)[最長不下降子序列·完全揹包問題·最近公共祖先]
- 動態規劃經典問題----最長公共子序列動態規劃
- 子串查詢;及排列子串分析
- 結對子作業總結
- poj3080-kmp+列舉子串 求最長公共子串KMP
- Java 的字串和子串Java字串
- lCS(最長公共子串)
- 演算法題:最長公共子序列演算法
- Amazon面試題:尋找最長迴文子串面試題
- 用滑動視窗來解決最長無重複子串問題
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 無重複字元的最長子串問題 (移動視窗法求解)字元
- 電力電子技術簡答題總結
- java 最長迴文子串Java
- #103. 子串查詢
- 變數子串的常用操作變數
- 刪除字串中的子串字串
- 糖果;及子串查詢分析
- 子串查詢函式strstr函式
- 76. 最小覆蓋子串
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 牛客題霸 [最長公共子串]C++題解/答案C++
- 牛客網 Coincidence(最長公共子串LCS板題)IDE
- Python找回文子串的方法Python
- Python小技巧 - 子串查詢Python
- 最長公共子序列(JAVA)Java
- lc1771 由子序列構造的最長迴文串的長度