最大上升子序列(动态规划)
s/给定数组,输出数组的最大上升子序列。
输入:两行测试数据
第一行代表数组元素个数
第二行输入数组中的整数
输出:输出最大上升子序列的长度
输入样例:
8
1 3 4 2 7 9 6 8
输出样例:
5
代码一和代码二思路一样,都是从数组的第i(1<=i<=n)位置开始寻找最大上升子序列,得到n个结果,输出这n个结果中最大的值。代码一是从前往后查找子序列,代码二是从后往前查找子序列。
代码一:
#include<stdio.h>
int length[1000][1000];
int len[1000];
int Max(int a,int b)
{
if(a>=b) return a;
else return b;
}
int Fun(int* b,int n)
{
int max;
int mmax=1;
for(int i=1;i<=n;i++) //从每个元素开始寻找最大上升子序列
{
length[i][i]=1;
max = b[i];
printf("%d ",b[i]);
for(int j=i+1;j<=n;j++) //寻找第i个元素到第n个元素的最大上升子序列
{
if(b[j]>max)
{
length[i][j]=length[i][j-1]+1;
max =b[j];
printf("%d ",b[j]); //输出每一次的子序列
}
else length[i][j] =length[i][j-1];
}
printf("%d\n",length[i][n]); //输出每一次寻找的子序列的元素个数
if(length[i][n]>mmax) mmax = length[i][n];
}
return mmax;
}
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int s= Fun(a,n);
printf("%d\n",s);
}
代码二:
#include<stdio.h>
int length[1000][1000];
int len[1000];
int Max(int a,int b)
{
if(a>=b) return a;
else return b;
}
int Fun(int*b,int n)
{
if(n==1) return 1;
int res = 1;
for(int i=1;i<=n;i++)
{
len[i]=1;
int min = -999;
printf("%d “,b[i]);
for(int j=1;j<i;j++)
{
if(b[j]<b[i]&&b[j]>min&&len[j]+1>len[i])
{
len[i] = len[j] +1;
printf(”%d ",b[j]);
min = b[j];
}
}
res = (res>len[i]?res:len[i]);
printf("%d\n",res);
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int s= Fun(a,n);
printf("%d\n",s);
}