感觉这种方法比dp好,所以记录一下,
主要的方法:
public static int lis(char a[]) {
char b[]=new char[a.length]; //非储存最长递增子序列,但其长度为最长子序列长度
b[0]=a[0];
int o=0;
//贪心
for(int i=1;i<a.length;i++) {
if(a[i]>b[o]) {
b[++o]=a[i];
}else {
//用二分法找前面大于a[i]的第一个数,个人认为这步最重要
b[erfen(b, o, a[i])]=a[i];
}
}
这是用二分法来配合上面的贪心
public static int erfen(char[] a,int b,int c) {
int d=0;
b--;
while(d<=b) {
int ban=(d+b)/2;
if(c>a[ban]) {
d=ban+1;
}else {
b=ban-1;
}
}
return d;
}