简单动态规划,求最长升序列。
dp[i] 表示从1到i的最长升序列长度。遍历1到i-1,如果a[i] > a[j] ,dp[i] = dp[j] + 1的最大值。
即dp[i] = max{dp[j] + 1,if(a[i] > a[j]),1<= j < i}
求出从1到n 的dp[i],取最大值即为结果。
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[1010];
for(int i=1; i<=n; i++)
{
cin >> a[i];
}
int dp[1010];
dp[0] = 0;
int max = 0;
for(int i=1;i<=n;i++){
dp[i] = 1;
for(int j=1;j<i;j++)
{
if(a[i] > a[j] && dp[i] < dp[j] + 1){
dp[i] = dp[j] + 1;
}
}
}
for(int i=1; i<=n; i++)
if(dp[i] > max)
max = dp[i];
cout << max << endl;
//system("pause");
}