子序列在原序列中可以是不连续的
动态规划求解:
//时间复杂度 n*n
//令c[i]表示:在a[0->i]中,当以a[i]为单调递增子序列最后一个元素时,所得最长单调递增子序列的长度。
状态转移方程:
c[0]=1;
c[i]=max{1,c[j]+1} a[j]<a[i]&&j<i;
int LongestIncr(int X[], int n, int c[], int line[])
{
int path[MAX];
//假设路径都是从自己开始,即元素i前的元素的编号为自己
for (int i = 0; i < n;++i)
{
path[i] = i;
}
c[0] = 1;
//状态转移
for (int i = 1; i < n; ++i)
{
c[i] = 1;
for (int j = 0; j < i; ++j)
{
//i加入子序列
if (X[i]>X[j] && c[j]+1>c[i])
{
c[i] = c[j] + 1;
path[i] = j; //i前的序号值
}
}
}
//得到最长子序列的长度值
int nmax = 0;
int end = -1;
for (int i = 0; i < n; ++i)
{
if (c[i]>nmax)
{
nmax = c[i];
end = i;
}
}
int k = 1;
line[0