最长上升子序列
思路:每一个都等于前面比它小的最长上升序列+1,如果前面没有比它小的那就置为1。
所以既要找前面比它小的,又要去找一个最大值。
代码如下
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=1000+7;
int a[maxn],dp[maxn];
int main()
{
int t,max1,max2,n;
while(~scanf("%d",&n))
{
max1=-1;//可以根据题目而定,在这数都>=0
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=0;j<=i-1;j++)
{
if(a[j]<a[i]&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
}
}
if(dp[i]>max1)
max1=dp[i];
}
printf("%d\n",max1);
}
return 0;
}
需注意的dp[i] < dp[j]+1这个条件,是为了连续几个 d[i]相同时只加一次。