最大上升子序列(动态规划)

2 篇文章 0 订阅

最大上升子序列(动态规划)

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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值