今天的每日一题让我想到了Lis算法,最初看别人的讲解并没有看明白,最后是自己想通了,所以记录一下。
Lis实际上就是一个不断更新的数组
其数值代表的就是这个数左边的最长上升子序的长度
既然代表的是左边的最长上升子序长度,那么我们从第二个数字开始不断更新这个数组的值,那么最终其中的每个数字左边的最长上升子序长度就都可以得出,其基本代码如下,也可以作为一个模板来使用,只需要修改flag就可以了
int[] Lis = new int[n];
int[] flag = new int[n];//flag即输入数组
Lis[0]=1;//因为第一个元素左边没有其他元素
for (int i = 1;i<n;i++){//从第二个元素开始更新Lis数组
for (int j = 0;j<i;j++){
int m = 1;//最小也应该为1,即这个元素本身
if (flag[i]>flag[j]){//如果flag[i]>flag[j]那么说明j的最长上升子序长度i肯定也可以符合,因为i是一直大于j,在j的右方
m = Math.max(m,Lis[j]+1);//所以进行判断取值
}
Lis[i]= Math.max(m,Lis[i]);//Lis要保持当前最大值
}
}
}