1. 实验环境

操作系统:Mac 64

运行内存:16GB

编程语言:Java

编译环境:Eclipse

2. 题目要求

设计一个Ο(nlgn)时间的算法,求一个 n 个数的序列的最长单调递增子序列。

A. 用户界面输入原始序列

设计便于用户操作的界面,可以输入 n 个数,在计算后输出最长单调递增子 序列和该子序列的长度。

B. 求最长单调递增子序列

获取文本框内容,依次遍历字符串的单个字符,如果递增,直接加入。否则, 采用二分法缩小递归范围,如果递增,需要修改值,而非加入。该算法时间复杂 度 Ο(nlgn)。

C. 用户界面得到子序列及长度

将求得的子序列及该子序列的长度返回到用户界面的文本框中。

D. 用户界面重置和计算

点击计算可求出子序列和长度。点击重置可重新输入序列并求结果。

4.项目结构

程序结构如下图所示,lmis_str.java 可处理多长度的序列;而 lmis_list_num.java 只可处理 int/long 范围的序列。项目结构如下图所示。

5. 实验结果

A. 程序运行界面和正确性

程序编译运行结果如下图所示。

图 1 程序编译运行结果界面 程序输入序列,运行结果如下图所示。

图 2 程序运行结果界面

6.实验代码

实现用户界面 求单调最长递增子序列

package dp;

import java.awt.EventQueue;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class lmis_str extends JFrame{

public static ArrayList list=new ArrayList();

public JPanel mainPanel=new JPanel();

public JLabel jLabel=new JLabel("输入序列:");

public JTextField jTextField=new JTextField(40);

public JLabel jLabel1=new JLabel("递增子序列:");

public JTextField jTextField1=new JTextField(40);

public JLabel jLabel2=new JLabel("递增子序列长度:");

public JTextField jTextField2=new JTextField(40);

public JButton rebtn=new JButton("重置");

public JButton calbtn=new JButton("计算");

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

//继承JFrame

lmis_str frame = new lmis_str();

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

public lmis_str(){

mainPanel.add(jLabel);

mainPanel.add(jTextField);

mainPanel.add(jLabel1);

mainPanel.add(jTextField1);

mainPanel.add(jLabel2);

mainPanel.add(jTextField2);

mainPanel.add(rebtn);

mainPanel.add(calbtn);

this.add(mainPanel);

this.setTitle("计算最长递增子序列:");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

this.setBounds(0, 0, 600, 600);

calbtn.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

String string=jTextField.getText();

jTextField1.setText(getLmis(string));

jTextField2.setText(String.valueOf(getLmis(string).length()));

}

});

rebtn.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

jTextField.setText("");

jTextField1.setText("");

jTextField2.setText("");

}

});

}

public String getLmis(String str){

List list=new ArrayList();

list.add(str.charAt(0));

int index=0;

for(int i=0;i

char c=(char) (str.charAt(i)-'0');

if(list.get(index)

list.add(++index,c);

}else{

int low=0;

int high=index;

while (low

int middle = (low+high)>>1;

if(list.get(middle)

low=middle+1;

else {

high=middle-1;

}

}

if(list.get(low)

list.set(low+1, c);

else

list.set(low, c);

}

}

System.out.println(list.size());

StringBuffer sBuffer=new StringBuffer();

for(int t:list){

sBuffer.append(t);

}

return new String(sBuffer);

}

}

7. 实验技巧与注意点

A. 在处理 n 个数时,可直接处理 string 的单个字符,这样不会限制长度。如果 处理 int/long 时会有位数的限制。

B. 在存储原始序列和结果子序列时,应使用 list,这样可以动态增加字符。如 果使用 Array,结果长度并不确定。

C.向 list 添加值时,需要将数字向字符转换,做(字符-‘0’)的操作。

D. 动态规划过程中,只有递归到最长子序列递增时才需要add,递归到递增需 要做 set 操作。

输出最长单调递增子序列java_动态规划实现最长单调递增子序列相关推荐

  1. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

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

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

  3. 动态规划算法04-最长递增子序列问题

    最长递增子序列问题 简述 经典的动态规划问题. 问题描述 给定一个序列,求解其中长度最长的递增子序列. 问题分析 这种可以向下查询答案的很容易想到动态规划的解法. 要求长度为i的序列Ai={a1,a2 ...

  4. 动态规划之最长递增子序列 最长不重复子串 最长公共子序列

    [前言]动态规划:与分治法相似,即通过组合子问题来求解原问题,不同的是分治法是将问题划分为互不相交的子问题,递归求解子问题,再将他们组合起来求出原问题的解. 动态规划则应用于子问题重叠的情况,通常用来 ...

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

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

  6. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  7. 【动态规划】最长公共上升子序列

    问题 F: [动态规划]最长公共上升子序列 时间限制: 5 Sec  内存限制: 64 MB 提交: 34  解决: 9 [提交] [状态] [命题人:admin] 题目描述 研究发现,大猩猩的基因序 ...

  8. 动态规划解决方案最长公共子序列问题(开启)

     动态规划 常常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地採用把大问题分解成子问题.并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数添加. 为 ...

  9. 算法知识之最长公共子序列问题(动态规划)

    最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...

最新文章

  1. 潘石屹 python 知乎_如何看待地产大佬潘石屹微博宣布学习python这件事?对我们有什么启发?...
  2. Java设计模式-外观模式
  3. LeNet试验(一) 搭建pytorch版模型及运行
  4. Flutter入门篇(一)
  5. .NET Core 3.0 即将结束生命周期,建议迁移 3.1
  6. MOXy作为您的JAX-RS JSON提供程序–服务器端
  7. 在python中、正确的函数定义格式为_Python函数的定义与实现
  8. ajax获取session值_cookie和session基础知识学习
  9. tcpdf最新版 6.2版
  10. java中jscrollpane_java中JScrollPane问题
  11. composer安装
  12. bootstrap table 适应移动端_前端框架bootstrap和layui有什么区别
  13. 现有php环境下安装memcached并测试(centos6.4系统64位)
  14. ElasticSearch常用的几种查询方式
  15. Tableau 自定义调色板及应用全流程讲解【保姆级】
  16. 毛星云opencv之用鼠标进行交互操作
  17. ZigBee单播通信
  18. matlab 中 矩阵取平方,matlab中怎样计算一个矩阵中每个数的平方
  19. 大数据毕设选题 - 京东消费数据分析与可视化(python 大数据 机器学习)
  20. mysql profiling sending data_Mysql一次Sending data占用大量时间的深入分析优化案例

热门文章

  1. 公众号加附件怎么做?公众号推文上传附件教程
  2. 「Mac安装ps」Adobo Photoshop 2023 下载安装详情教程,支持 AI 插件的 24 版 Photoshop
  3. 89、常见气体的爆炸极限
  4. 超长干货!Cocos Creator 粒子系统详解,零代码实现逼真自然效果
  5. 网易伏羲AI虚拟人技术赋能网易云音乐虚拟偶像“乐灵”正式出道
  6. 文字转语音工具—百度语音广播
  7. java 抽象类 详解
  8. android盒子分屏,分屏智投投屏神器免费版 1.7.4 安卓免费版
  9. 51单片机 - - 简介
  10. html5 点球,西媒指出皇马5获点球巴萨1粒 C罗该改名叫点球罗