#include<iostream>
using namespace std;
#include<algorithm>
#include<string.h>
int num[1005];
int dp[1005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
int j;
for(i=0;i<n;i++)
dp[i]=1;
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(num[i]>num[j]&&dp[i]<=dp[j])
dp[i]=dp[j]+1;
//个人觉得这个实现还是挺简洁大方的
}
}
for(i=0;i<n;i++)
printf("%d ",dp[i]);
printf("\n");
}
return 0;
}
☝模板
最长递增子序列如果使用dp解决的话,就还是n²的复杂度,dp数组存的是以第i个数结尾的最长子序列,在这之前,要把它前面的遍历一边,所以就有了n²的复杂度。
状态转移方程就是
dp[i]=max(max(dp[j] | num[j]<num[i],j<i)+1,1);
至于这个状态转移方程怎么实现就不一定了