题意:题目很难懂,题意很简单,求最长递增子序列LIS。

分析:本题的最大数据40000,多个case。用基础的O(N^2)动态规划求解是超时,采用O(n*log2n)的二分查找加速的改进型DP后AC了。

在基础的动态规划解法中,由于动态规划的无后效性(对于每个阶段来说,它以前的各阶段状态无法直接影响它未来的决策,只能间接地通过当前状态来影响),当我们考察第i+1个元素的时候,我们是不考虑前面i个元素的分布情况的。当我们考虑前面的情况时会发现,对于前面i个元素的任意一个递增子序列,如果这个子序列的最大元素比Array[i+1]小,那么就可以将Array[i+1]加在这个子序列后面,构成一个新的递增子序列。因此我们希望找到前i个元素的一个递增子序列。使得这个递增子序列的最大元素尽可能地小,且长度尽可能地长。这个确定的过程就可以用二分查找加速。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Main {
static int BinSearch(int a[], int length, int s) {
int left = 0, right = length - 1, mid = 0;
while (left <= right) {
mid = (left + right) / 2;
if (a[mid] <= s) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
} static int[] MaxV = new int[40001]; static int getLIS(int[] arr, int size) {
MaxV[0] = arr[0];
int len = 1;
for (int i = 1; i < size; ++i) {
if (arr[i] > MaxV[len - 1]) {
MaxV[len++] = arr[i];
} else {
int pos = BinSearch(MaxV, len, arr[i]);
MaxV[pos] = arr[i];
}
}
return len;
} public static void main(String[] args) throws NumberFormatException,
IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cases = Integer.parseInt(br.readLine());
int n;
int a[] = new int[40001];
while (cases-- != 0) {
n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(br.readLine());
}
System.out.println(getLIS(a, n));
}
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. codevs 1432 总数统计
  2. 1047. Student List for Course (25)
  3. SwfUpload学习记录
  4. 1:CSS中一些@规则的用法小结 2: @media用法详解
  5. OrzFAng系列–树 解题报告
  6. JavaScript闭包函数的写法
  7. 90社交网络的行为报告后:不拒绝陌生人,TFBOYS作为一个喜爱
  8. Mybatis学习(8)逆向工程
  9. (转)关于request.getServletPath(),request.getContextPath()的总结
  10. java 反射与其应用
  11. Redis的Errorlog或者启动日志(错误日志)的配置
  12. cf861D 字典树+时间戳
  13. Python---遍历序列的各种方式
  14. Highcharts属性与Y轴数据值刻度显示Y轴最小最大值
  15. 【产品案例】我是如何从零搭建起一款健身O2O产品的?
  16. HTTP协议和XMPP协议、MQTT协议
  17. Visual Studio 2013/2015/2017快捷键(转)
  18. 微信内置浏览器浏览H5页面弹出的键盘遮盖文本框的解决办法(转)
  19. [Jenkins] 在Jenkins执行单个test suite
  20. java将System.out.println的输出导出到文件中

热门文章

  1. Django---Blog系统开发之注册页面(验证码&amp;ajax发送文件)
  2. hadoop 伪分布模式环境搭建
  3. QT QFtp使用实例 从FTP下载一个文件
  4. ReverseInteger
  5. Tedis:淘宝的Redis的Java客户端开发包
  6. Merge 2
  7. 八大排序算法原理以及Java实现(直接插入排序)
  8. win32下开发hadoop
  9. lr中检查点的使用web_find()和web_reg_find()的区别
  10. hbase-0.20.6/bin/hbase-daemon.sh: Permission denied