最长递增子序列长度
样例输入
7
1 7 3 5 9 4 8
样例输出
4
b[i]是a[i]为单调递增子序列最后一个元素时,所得最长递增子序列的长度。
先找出在a[i]前面并且比a[i]小的,然后比较那个b[i]最大,则此时a[i]相对的b[i]=max(b[j])+1.
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int b[1005];
int main()
{
int n;
while(~scanf("%d",&n))
{
b[0]=1;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int max1=0;
for(int i=1;i<n;i++)
{
max1=0;
for(int j=i-1;j>=0;j--)//往前面寻找
{
if(a[i]>a[j]&&b[j]>max1)
max1=b[j];
}
b[i]=max1+1;
}
int max2=0;
for(int i=0;i<n;i++)//求b[i]的最大值,也就是最长递增子序列的长度
{
if(b[i]>max2)
max2=b[i];
}
printf("%d\n",max2);
}
return 0;
}
构造最优解
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int b[1005];
int c[1005];
int pre[1005];//记录前一个前一个数据编号
int main()
{
int n;
while(~scanf("%d",&n))
{
b[0]=1;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int max1=0;
for(int i=1;i<n;i++)
{
max1=0;
for(int j=i-1;j>=0;j--)
{
if(a[i]>a[j]&&b[j]>max1)
{
max1=b[j];
pre[i]=j;
}
}
b[i]=max1+1;
}
int max2=0;
int temp=0;
for(int i=0;i<n;i++)
{
if(b[i]>max2)
{
max2=b[i];
temp=i;//记录最长递增子序列最后一个元素的位置
}
}
int i=temp;
int num=max2;//长度
int j=max2;
while(num>0)//将最优解拷贝到c数组中
{
c[j]=a[i];
j--;
i=pre[i];
num--;
}
for(int i=1;i<=max2;i++)
printf("%d ",c[i]);
printf("\n");
}
return 0;
}