思路,添加一个辅助数组dp,dp[i]表示以arr[i]元素为最末元素的最长递增子序列的长度,举例如下
arr 1 5 2 6 3 8 4
dp 1 2 2 3 3 4 4
备注,本文参考了牛客网上的思路,但代码是自己编写。
<span style="font-size:18px;">//输出一个最长的递增子序列
void MaxSubSeq(int arr[], int num)
{
int *dp = new int[num];
int max_index;
int max_dp;
for(int i = 0; i < num; i++)
{
dp[i] = 1;
}
for(int i = 1; i < num; i++)
{
for(int j = 0; j < i; j++)
{
//新构建的最长子序列(dp[j]+1)的长度必须大于之前已经构建好的子序列(dp[i])长度,
//才能让该节点(arr[i])加入新的子序列中
if(arr[j] < arr[i] && dp[j] + 1 > dp[i])
{
dp[i] = dp[j] + 1;
}
}
}
max_dp = dp[0];
for(int i = 1; i < num; i++)
{
if(max_dp < dp[i])
{
max_dp = dp[i];
max_index = i;
}
}
int *tmp = new int [max_dp];
tmp[max_dp - 1] = arr[max_index];
int k = max_index;
int r = 1;
for(int j = max_index - 1; j >= 0; --j)
{
if(arr[j] < arr[k] && (dp[j] == dp[k] - 1))
{
k = j;
r++;
tmp[max_dp - r] = arr[j];
}
}
Print(tmp, max_dp);
}
int main()
{
int arr[7] = {1, 5, 2, 6, 3, 8, 4};
MaxSubSeq(arr, 7);
getchar();
return 0;
}</span>