题目描述:
求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
思路:动态规划。
建立辅助数组dp[],记录以每个元素开始的最大序列的长度,如题dp = {5,3,2,1,4,3,2,1}
取dp(n)表示该值,则,dp(i)就等于[ i+1,n ]之间最大的dp加1,前提是这个第i个数最大。
时间复杂度O(n^2),从后向前,遍历数组,同时比较dp取得该元素的dp值(这里比较需要一个for循环)。
如果需要打印的话,也可根据dp值,由大到小遍历一遍,即可。
#include <iostream>
#include <cstring>
using namespace std;
int GetDP(int arr[], int dp[], int len)
{
int maxLen = 0;
for (int i = len - 1; i >= 0; i--)
{
int nLen = 0;
for (int j = i + 1; j < len; j++)
{
if (arr[j] < arr[i])
{
nLen = nLen < dp[j] ? dp[j] : nLen;
}
}
dp[i] = nLen + 1;
maxLen = maxLen < dp[i] ? dp[i] : maxLen;
}
return maxLen;
}
void PrintMaxSequence(int arr[], int dp[], int maxLen, int len)
{
for (int i = 0; i < len; i++)
{
if (dp[i] == maxLen)
{
cout << arr[i] << " ";
maxLen--;
}
}
cout << endl;
}
int main()
{
int arr[] = {9, 8, 2, 1, 7, 5, 3, 4, 3, 2, 1};
int len = sizeof(arr) / sizeof(*arr);
int *dp = new int[len];
memset(dp, 0, len);
int maxLen = GetDP(arr, dp, len);
cout << maxLen << endl;
PrintMaxSequence(arr, dp, maxLen, len);
delete [] dp;
return 0;
}
http://blog.csdn.net/wumuzi520/article/details/7378306