【Java学习】Java中字符串的常见操作
2014-08-30 10:23
585 查看
题意在一个整数序列中求出相邻元素相差不超过 m 的最长子序列。
易得到 dp 方程。 dp[i]= max{ dp[j]+ 1, 1<= j < i 且 d[i] 与 d[j] 相差不超过 m } 方程复杂度为 o(n^2) 。
用线段树对方程进行优化,先将数据离散化,使得数据范围变成 [1,n]。在上述方程求 dp[i] 的值时,对 i 前面的数遍历找出最优值相当于在区间 [ d[i]- m, d[i]+ m ] 内找出最优值,这个可以用线段树优化,使得复杂度达到 nlogn。
代码:
易得到 dp 方程。 dp[i]= max{ dp[j]+ 1, 1<= j < i 且 d[i] 与 d[j] 相差不超过 m } 方程复杂度为 o(n^2) 。
用线段树对方程进行优化,先将数据离散化,使得数据范围变成 [1,n]。在上述方程求 dp[i] 的值时,对 i 前面的数遍历找出最优值相当于在区间 [ d[i]- m, d[i]+ m ] 内找出最优值,这个可以用线段树优化,使得复杂度达到 nlogn。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; int const N= 102410; int tb[N<<2]; int n, k, dat , sn ; int query( int x, int y, int L, int R, int rt ){ if( L== x && y== R ) return tb[rt]; int mid= (L+ R)>>1; if( y<= mid ) return query( x, y, L, mid, rt<<1 ); else if( x> mid ) return query( x, y, mid+ 1, R, rt<<1|1 ); else{ int a= query( x, mid, L, mid, rt<<1 ); int b= query( mid+ 1, y, mid+ 1, R, rt<<1|1 ); return max(a,b); } } void update( int x, int y, int L, int R, int rt ){ if( L== R ){ tb[rt]= max( tb[rt], y ); return; } int mid= (L+ R)>> 1; if( x<= mid ) update( x, y, L, mid, rt<<1 ); else update( x, y, mid+ 1, R, rt<<1|1 ); tb[rt]= max( tb[rt<<1], tb[rt<<1|1] ); } int main(){ int test; scanf("%d",&test ); while( test-- ){ scanf("%d%d",&n,&k ); for( int i= 1; i<= n; ++i ) scanf("%d", dat+ i ); copy( dat+ 1, dat+ 1+ n, sn+ 1 ); sort( sn+ 1, sn+ 1+ n ); fill( tb, tb+ (n<<2), 0 ); int ans= 0; for( int i= 1; i<= n; ++i ){ int x= lower_bound( sn+ 1, sn+ 1+ n, dat[i]- k )- sn; int y= upper_bound( sn+ 1, sn+ 1+ n, dat[i]+ k )- sn- 1; int tmp= query( x, y, 1, n, 1 ); if( tmp+ 1> ans ) ans= tmp+ 1; x= lower_bound( sn+ 1, sn+ 1+ n, dat[i] )- sn; update( x, tmp+ 1, 1, n, 1 ); } printf("%d\n", ans ); } return 0; }
相关文章推荐
- 【Java学习】Java中字符串的常见操作
- Java学习笔记35:Java常用字符串操作函数
- Java中String类(字符串操作)的10个常见问题和解决方法
- Java学习提要——认识'泛型'与其常见操作
- Java学习手记--运算符和字符串的操作
- 【Java编程基础】01.Java中的String类以及字符串的常见操作
- Java_字符串反转操作学习
- Java学习提要——File类常见操作与目录操作
- JAVA学习笔记(4-1-数组及常见操作1)
- java===java基础学习(4)---字符串操作
- Java学习笔记----------------常见IO操作
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
- Java基础视频教程第04天_学习笔记之数组常见操作
- java常见的字符串操作和日期操作汇总
- 常见字符串操作: C++ string 类 和Java String类 用法小结
- 黑马程序员之java中操作字符串的常用类String和StringBuffer学习
- java学习——字符串操作
- java字符串的常见的操作
- 【代码学习】PYTHON字符串的常见操作
- Java中的string介绍和字符串常见操作