求最长非升子序列长度,主要使用dfs(递归实现)以及dp两种方法。源码如下:
#include <iostream>
using namespace std;
//overrall variable
int * numbers;
int * dp;
int nums;
int max_length_dfs;
int max_length_dp;
//dfs-recursively implemented
void dfs_recursive(int * number,int pos,int length)
{
for(int i = pos;i < nums;i++)
{
if(number[i] < number[pos])
{
dfs_recursive(number,i,length+1);
}
}
if(length > max_length_dfs)
{
max_length_dfs = length;
}
}
int dping(int pos)
{
if(dp[pos] > 0)
return dp[pos];
int max = 0;
for(int i = 0;i < pos;i++)
{
if(dping(i) > max && numbers[i] >= numbers[pos])
max = dping(i);
}
dp[pos] = max + 1;
return dp[pos];
}
int main()
{
cin >> nums;
numbers = new int[nums];
dp = new int[nums];
for(int i = 0;i < nums;i++)
{
cin >> numbers[i];
dp[i] = 0;
}
//dfs
dfs_recursive(numbers,0,1);
//dp
for(int i = 0;i < nums;i++)
{
if(dping(i) > max_length_dp)
max_length_dp = dping(i);
}
cout << "The result by dfs: " << max_length_dfs << endl;
cout << "The result by dp: " << max_length_dp << endl;
//free
delete [] numbers;
delete [] dp;
system("pause");
}