题目大意:
给出一串数字,找出其中最长的不下降子序列,若相同,找出最前的一组。如:3,18,7,14,10,12,23,41,16,24。则最长
不下降子序列为3,7,10,12,16,24,长度为6。
对于动态规划方程:F[t] = max{1, F[j] + 1} (j = 1, 2,..., t - 1, 且A[j] < A[t]),有例子:2,3,1,2,3,在1的位置F[3]变为1.
对于(1)x < y < t;(2)A[x] < A[y] < A[t];(3)F[x] = F[y],有例子:1,2,3,10,11,8,10,4,9...当A[x] = 8,A[y] = 9时,F[x] = F[y].
这里有个特点,就是这种条件只有在A[x],A[y]不算入F函数时成立。
很明显,选择A[x]比选择A[y]要好。因为由于条件(2),在A[x+1] ... A[t-1]这一段中,如果存在A[z],A[x] < A[z] < A[y],则与选择A[y]相比,将会得到更长的不下降子序列。
#include<cstdio>
long long d[1000],a[1000];
long long len,i,k,n;
long long min(long long t)
{
long long s,w,mid;
s = 0;
w = len;
while(s < w)
{
mid = (s + w)/2;
if(d[mid] <= t){ s = mid + 1; }
else{ w = mid; }
}
return s;
}
int main(void)
{
scanf("%d",&n);
for(i = 0;i < n;i++){ scanf("%d",&a[i]);}
len = 0;
d[0] = -29888888;
for(i = 1;i <= n;i++)
{
if(a[i] >= d[len])
{
len++;
d[len] = a[i];
printf("%d ",d[len]);
}
else
{
k = min(a[i]);
d[k] = a[i];
}
}
printf("\n");
printf("%d\n",len);
}