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类别)的更多相关文章

  1. LIS LCS n^2和nlogn解法 以及LCIS

    首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由 ...

  2. 【十大经典数据挖掘算法】AdaBoost

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...

  3. 【十大经典数据挖掘算法】SVM

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART SVM(Support Vector ...

  4. 【十大经典数据挖掘算法】Naïve Bayes

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 朴素贝叶斯(Naïve Bayes) ...

  5. 【十大经典数据挖掘算法】C4.5

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...

  6. 【十大经典数据挖掘算法】k-means

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...

  7. 【十大经典数据挖掘算法】kNN

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 顶级数据挖掘会议ICDM ...

  8. 【十大经典数据挖掘算法】CART

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 前言 分类与回归树(Class ...

  9. 【十大经典数据挖掘算法】k

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...

随机推荐

  1. mxonline实战4,用户登陆页面2和用户注册1

            一. 基于类来定义view.py diango中使用基于类来定义views的功能,其实更加方便,因为这样可继承一些定义好的基类,来减少我们的代码量   1. 使用基于类的方法,来重新定 ...

  2. 几种封装javaBean的方法

    开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类.下面从反射开始介绍. 1.javaBean介绍: 简介 ...

  3. vector类型介绍

    一.vector类型简介 标准库:集合或动态数组,我们可以放若干对象放在里面. vector他能把其他对象装进来,也被称为容器 #include <iostream> #include & ...

  4. Oracle 11g

    Oracle 11g 第一章  Oracle 11g数据库简介 1.1  认识Oracle11g Oracle 11g是Oracle 数据库最新的版本,目前已经被企业广泛的应用. 1.2  Oracl ...

  5. Codeforces Round #555 (Div. 3) A B C1(很水的题目)

    A. Reachable Numbers 题意:设f(x)为 x+1 这个数去掉后缀0的数,现在给出n,问经过无数次这种变换后,最多能得到多少个不同的数. 代码 #include<cstdio& ...

  6. BLE pairing vs. bonding

    differece between pairing and bonding .see

  7. Mac 10.12安装抓包工具Charles

    说明:青花瓷,Filddler之后就是这个最好用.收费软件. 下载: (链接:https://pan.baidu.com/s/1kV1Robl 密码: 3g6u)

  8. Mac OS 10.12使用U盘重装(转)

    OS X Capitan和macOS Sierra的安装方式和下载系统的方法都是一致的,下面是OS X Capitan的安装方法: 一.准备工作: 准备一个8GB或者8G以上容量的U盘 确保里面的数据 ...

  9. (转)OpenStack之服务端口号

    原文:https://blog.csdn.net/henulwj/article/details/47276391 在部署openstack的过程中,你会遇到配置各种服务的endpoint,opens ...

  10. 数据库主键ID生成策略

    前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...