仍然用dp,因爲最長上升字序列是最優問題,而且保證最優解由最優子解構成
數組爲a[n],解爲dp[n]
dp[i]表示以a[i]結尾的最長上升子序列長度
i的範圍:[0-j),如果a[j] > a[i],則存在上升子序列dp[i] +1,求最長則得d[j]。
注意不一定dp[n-1]是最長的,所以還要求d[n]中最大值。
#include<iostream>
#include<stdio.h>
using namespace std;
int a[1000];
int dp[1000];
int main()
{
int n,max;
while(scanf("%d",&n) != EOF && n!=0 )
{
max = 1;
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;++i)
{
dp[i] = 1;
}
for(int i =1;i<n;++i)
{
for(int j =0;j<i;++j)
{
if(a[i] > a[j])
{
if(dp[i] < dp[j]+1)
{
dp[i] = dp[j]+1;
if(max < dp[i])
max = dp[i];
}
}
}
}
printf("%d\n",max);
}
return 0;
}