给定一个序列,求其最长子序列的长度
假设序列为 3 6 2 3 4
第一个数是 3 前面没有比 3 小的,所以 dp[0]=1;
第二个数是 6 前面 3 比 6 小,所以 dp[1]=dp[0]+1;
第三个数是 2 前面没有比 2 小的,所以 dp[2]=1;
#include<cstring>
using namespace std;
int dp[1000],a[1000];
int main()
{
int n;
while(cin>>n)
{
int ans=0;//记录长度
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++)
{
cin>>a[i];
}
for(int i=0; i<n; i++)
{
dp[i]=1;
for(int j=0; j<i; j++)
{
if(a[j]<a[i])
{
dp[i]=max(dp[i],dp[j]+1);//不断更新,找出最大值
}
}
ans=max(ans,dp[i]);//不断更新,找出最大值
}
cout<<ans<<endl;
}
return 0;
}
假设序列为 3 6 2 3 4
第一个数是 3 前面没有比 3 小的,所以 dp[0]=1;
第二个数是 6 前面 3 比 6 小,所以 dp[1]=dp[0]+1;
第三个数是 2 前面没有比 2 小的,所以 dp[2]=1;
第四个数是 3 前面有比 3 小的,所以 dp[3]=dp[2]+1;
第五个数是 4 前面有比 4 小的,所以 dp[2]=max(dp[0],dp[2],dp[3])+1;
d(i)=max(1,d(j)+1),i>j,且a[i]>a[j];
#include<iostream>#include<cstring>
using namespace std;
int dp[1000],a[1000];
int main()
{
int n;
while(cin>>n)
{
int ans=0;//记录长度
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++)
{
cin>>a[i];
}
for(int i=0; i<n; i++)
{
dp[i]=1;
for(int j=0; j<i; j++)
{
if(a[j]<a[i])
{
dp[i]=max(dp[i],dp[j]+1);//不断更新,找出最大值
}
}
ans=max(ans,dp[i]);//不断更新,找出最大值
}
cout<<ans<<endl;
}
return 0;
}