解答
思路:
一般算法解决不了,考虑中间状态
·设LIS[i]为到第i个数时的最大子序列长度
·则有LIS[i] = max{1, LIS[k] +1}, 其中k<i,且a[i]>a[k],
·即对下标比i小的每一个位置的LIS值做比较,如果a[i]>a[k]时, LIS[k]+1,取里面的最大值; 如果a[i]最小,则记为1。
·边界值是LIS[0] = 1
核心代码:
int LIS(int []a, int n)
{
int []LIS = new int[n];
LIS[0] = 1;
for(int i = 0 ; i < n ; i++)
{
LIS[i] = 1;
for(int j = 0 ; j<i; j ++)
{
if(a[i] > a[j] && LIS[j] + 1 > LIS[i])
LIS[i] = LIS[j] + 1;
}
}
int max = 0;
for (int i = 0; i<n ; i ++)
{
if(LIS[] > max)
max = LIS[i]
}
return max;
}
又搞定一个知识盲区
写的不错 共勉~,最近也在开始写博客。大佬们来翻牌啊!
这道题属于最难得那一级