回顾经典问题算法:LIS, LCS-(DP类别)
LIS,最长递增子序列
说明见:http://blog.csdn.net/sdjzping/article/details/8759870
#include <iostream>
#include <cstdlib> using namespace std; int LIS(int* arr, int len) {
if (arr == NULL || len < ) return ;
int LIS[len] = {};
int mlen = ;
for (int i=; i<len; i++) {
LIS[i] = ;
for (int j = ; j < i; j++) {
if (arr[j] < arr[i] && LIS[i] < LIS[j] + ) {
LIS[i] = LIS[j] + ;
}
}
if (LIS[i] > mlen) {
mlen = LIS[i];
}
}
return mlen;
} int main() {
int arr[] = {, -, , -, , -, , -};
int len = sizeof(arr) / sizeof(arr[]);
cout<<LIS(arr, len)<<endl;
system("pause");
return ;
}
再给出nlogn的解法,其中len2val数组就是记录当前LIS长度时结尾的数字(可能情况下的最小值,如1,3和1,2同样可以构成长度为2的LIS但是取len2val[2]=2),关于这个数组的详细说明,可以参考第一个给出的连接,相对于第一个算法的改进就是该数组是有序的,可以使用二分搜索,即在数组中找到第一个比待处理值V大或相等的index设为I(就是序列长度),那么这个V必然可以插入到以len2val[I-1]结尾的长度为I-1的序列后部,形成新序列的长度为I,因而更新数组len2val[I] = V(更新是因为当前值肯定是大于等于V的,因为一开始就是根据这个条件进行搜索的)。这个查找的过程可以用STL中的lower_bound来做,这里自己按照源码写了一个直接返回索引的版本,STL中返回的是迭代器(数组迭代器就是元素指针,比较时还需减掉数组起始位置,才能得到索引)。
int idx_lower_bound(int a[], int begin, int end, int target) {
int count = end - begin;
int first = begin;
while (count > ) {
int step = count/;
int idx = first + step;
if (a[idx] < target) {
first = ++idx;
count = count - step - ;
} else {
count = step;
}
}
return first;
}
int LIS_NLOGN(int arr[], int len) {
if (arr == NULL || len < ) {
return ;
}
int* len2idx = new int[len+];
len2idx[] = arr[];
int maxlen = ;
for (int i=; i<len; i++) {
char ch = arr[i];
int upper = idx_lower_bound(len2idx, , maxlen + , ch);
len2idx[upper] = ch;
if (upper > maxlen) {
maxlen = upper;
}
}
return maxlen;
}
LCS,最长公共子序列
#include <iostream>
#include <cstdlib>
#include <cstring> using namespace std; int max(int a, int b) {
return a > b ? a : b;
} int LCS(const char* s1, int len1, const char* s2, int len2) {
if (s1 == NULL || s2 == NULL || len1 < || len2 < ) return ; int dp[len1 + ][len2 + ]; for (int i=; i<=len1; i++) {
for (int j=; j<=len2; j++) {
dp[i][j] = ;
}
} for (int i=; i<= len1; i++) {
for (int j=; j<=len2; j++) {
if (s1[i-] == s2[j-]) {
dp[i][j] = dp[i-][j-] + ;
} else {
dp[i][j] = max(dp[i-][j], dp[i][j-]);
}
}
}
for (int i=; i<=len1; i++) {
for (int j=; j<=len2; j++) {
cout<<" "<<dp[i][j];
}
cout<<endl;
}
return dp[len1][len2];
}; int main() {
const char* s1 = "helloyyc";
const char* s2 = "xellxddc"; cout<<LCS(s1, strlen(s1), s2, strlen(s2))<<endl; system("pause");
return ;
}
回顾经典问题算法:LIS, LCS-(DP类别)的更多相关文章
- LIS LCS n^2和nlogn解法 以及LCIS
首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由 ...
- 【十大经典数据挖掘算法】AdaBoost
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...
- 【十大经典数据挖掘算法】SVM
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART SVM(Support Vector ...
- 【十大经典数据挖掘算法】Naïve Bayes
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 朴素贝叶斯(Naïve Bayes) ...
- 【十大经典数据挖掘算法】C4.5
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...
- 【十大经典数据挖掘算法】k-means
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...
- 【十大经典数据挖掘算法】kNN
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 顶级数据挖掘会议ICDM ...
- 【十大经典数据挖掘算法】CART
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 前言 分类与回归树(Class ...
- 【十大经典数据挖掘算法】k
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...
随机推荐
- CentOS6.5加域
为减少错误已提前关掉了SELinux,防火墙. yum install nss-pam-ldapd -y 第一步:更改主机名为linux.itxdm.me 第二步:更改setup内左边Winbind ...
- notepad++常用操作梳理
在 设置---管理快捷键 可以查询/重置快捷键.如下: 工作or学习中最长用到的操作: Ctrl+ALT-C:列编辑Ctrl+U:转换为小写Ctrl+Shift+U:转换为大写Ctrl+B:跳转 ...
- 对drf视图的理解
视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...
- k-近邻算法 python实现
必要的注释已经写在code里面了: import operator from numpy import* def init(): grp=array([[1.0,1.1],[1.0,1.0],[0,0 ...
- jsp页面struts2标签展示clob类型的数据
直接从数据库中查出来的数据,是clob类型的在前端页面展示的时候是这样: 后来找到了一个方法,在action中添加一个方法,解析转换clob数据的方法 public String getClob(Cl ...
- [ZJOI2019]Minimax搜索
先求出根节点的权值\(w\).根据套路,我们对于每个\(k\),计算\(w(s)\leq k\)的方案数,差分得到答案.为了方便,接下来考虑计算概率而不是方案数. 可以发现,对于一个给定的有解的子集, ...
- vue.js - axios Get、Post方法传参给 .net core webapi。
一:axios中是 Get请求: 1:在vue项目中通过params属性携带数据: let _self = this; axios({ method:'get', url:'http://localh ...
- 造一个轮子然后安装到pypi上
之前写了一个爬虫的包,主要是根据自己写爬虫的情况总结一下. 因为每次都要重复写一些代码,所以提炼出来,类似一个框架的样子吧. 开始是放在自己的项目里引用,但如果换了一个项目,就得重新拷一遍,很麻烦. ...
- 用python开发了一个简单apache web服务端范例,在win10 + apache2.4.9 + python3.5 测试成功
#!D:\Programs\Python\Python35-32\python.exe import cgi def htmlTop(): print("Content-type: ...
- ubuntu安装ntp时间服务器
1.安装ntp软件 sudo apt-get install ntp2.修改配置文件 sudo vim /etc/ntp.conf driftfile /var/lib/ntp/ntp.dr ...