前面三篇博客分别讲了贪心,递归,分治,今天就说个简单的动态规划(DP)的题目吧。在我心中DP算是比较难的算法,尤其像状态DP,树形DP,因为实力问题就说一个简单的线性DP——最长单调递增子序列。

题目如下:

计算一个给定整数序列的最长单调递增子序列的长度(最优值)及该序列内容(最优解)。给定一个序列X={x1,x2,…xn},{xi1,xi2,…,xim}称为X的一个长度为m的单调递增子序列,如果满足i1

思路我就不作太多的分析了就一个最简单普通的DP问题,代码里有注释,考虑到osc上好多童鞋对java代码感兴趣所以这次贴的是java代码。下面的代码的时间是O(n*n)不是最优,但是好理解,优化的可以将顺序查找改为二分查找

代码如下:

/*

* 最长单调递增子序列

* 1)用一个数组b[n]记录以a[i]结尾的最长单调递增子序列的长度;

* 2)序列的a的最长单调子序列的长度为max{b[i],0=

* 3)b[i] = max{b[k],a[k]<=a[i]&&0=

*

* auther:thj

*/

public class LIS

{

private int[] a;

private int[] b;

public LIS(int[] a)

{

this.a = a;

b = new int[a.length];

}

public void lis()

{

b[0] = 1;

for (int i = 0; i < a.length; i++)

{

int k = 0;

for (int j = 0; j < i; j++)

{

if (a[j] <= a[i] && k < b[j])

{

k = b[j];

}

}

b[i] = k + 1;

}

int k = max(b);

//输出结果

print(k);

}

//求数组中最大值下标

private int max(int[] b)

{

int max = b[0];

int k = 0;

for (int i = 0; i < b.length; i++)

{

if (max < b[i])

{

max = b[i];

k = i;

}

}

return k;

}

//输出

public void print(int k)

{

for (int i = k - 1; i >= 0; i--)

{

if (b[k] == b[i] + 1 && a[i] <= a[k])

{

print(i);

break;

}

}

System.out.print(a[k] + " ");

}

public static void main(String[] args)

{

int[] a = {5, 2, 4, 6, 5, 1, 8};

LIS lis = new LIS(a);

lis.lis();

}

}

最长单调递增子序列 python_最长单调递增子序列相关推荐

  1. 最长回文子串python_最长回文子串(Python)

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  2. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  3. c语言最长递增子序列nlogn,最长递增子序列

    问题定义: 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6, ...

  4. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  5. 动态规划(最长递增子序列)---最长递增子序列

    最长递增子序列 300. Longest Increasing Subsequence (Medium) 题目描述:   给定一个数组,找到它的最长递增子序列 思路分析:   动态规划思想,定义一个数 ...

  6. 最长公共子序列、最长连续公共子序列、最长递增子序列

    面试中除了排序问题,还会经常出现字符串的子序列问题,这里讲解使用动态规划解决三个常见的子序列问题: 1.最长公共子序列问题(LCS,longest-common-subsequence problem ...

  7. 数组的最长递减子序列java_最长递增/递减子序列

    <编程之美>里有个题目是要求数组中最长递增子序列,在CSDN上看到的题目是数组中的最长递减子序列.题目如下: 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子 ...

  8. 字符串最长公共子序列python_求解两个字符串的最长公共子序列

    一,问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB 则这两个字符串的最长公共子序列长 ...

  9. 求序列最长不下降子序列_最长不下降子序列nlogn算法详解

    今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...

最新文章

  1. 十大python开发软件-必看 | 2020年,Python十大应用领域介绍!
  2. CISCO ASA 防火墙 IOS恢复与升级
  3. mysql数据库的行级锁有几种_mysql锁之三种行级锁介绍
  4. 物联网软件IoT.js、JerryScript、Smart.js、Calvin介绍
  5. UAA服务基础环境搭建
  6. 华为可以分屏吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...
  7. 华为nova9 SE官网上架:华为首款1亿像素手机
  8. windows一键安装oracle,Oracle在Windows下快速搭建
  9. 文件打印服务器解决方案
  10. php 简易教学管理系统
  11. url 转码 java_URL 转码遇到的坑
  12. 2020-11-30 DOA估计/方向谱分析 中文书单
  13. 英伟达辟谣 RTX 3060 被破解传闻
  14. java https双向验证_Https双向验证与Springboot整合测试-人来人往我只认你
  15. 【Java:JDBC+MySQL实现学生信息管理系统】
  16. 马云被骗十亿?最后却被百倍奉还。
  17. 自然语言处理——谷歌BERT模型深度解析
  18. android清单文件的作用,Android 清单文件
  19. 并购之后 新联想面临的四十个难题(转发)--市场营销
  20. 如何在Windows终端中使用电力线,书呆子字体,Cascadia代码,WSL和oh-my-posh进行漂亮提示

热门文章

  1. 计算机语言简约发展史
  2. C语言,英文小写转大写,小写字母转换成大写字母通过大小写字母间的ASCII值的关系来建立代码
  3. 欧洲统一语言参考标准C1,浅述欧洲统一语言参考标准.doc
  4. win10中设置程序开机自启动
  5. 监狱人太多!英国考虑半年刑期以下的犯人不用坐牢
  6. 玩转github客户端
  7. iOS 网络环境模拟流量监控实战
  8. 计算机病毒英语四级作文,2020年6月大学英语四级作文范文50例:信息安全
  9. a=b++和a=++b的区别
  10. leetCode-考场就座