求教:如何求最大子序列元素的个数!~

Pajack 2009-04-08 06:28:10
有一正整数列a1,a2,...an,(个数在100个左右,元素最大值为100)
请问如何求上述数列的一个最大升序子序列的元素个数。

如:80,85,100,1,3,5,60,70,100,98,95,90,93,86,20,25,45,50,78
最大升序子序列为:1,3,5,20,25,45,50,78,个数为8.

说明:不要求元素一定连续。

请大家给点思路,给代码的请加点注释,谢谢!~
...全文
168 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeroieme 2009-04-09
  • 打赏
  • 举报
回复

是否升序相邻的逐对比较就是了,a[i]<=a[i+1]

是,当前序列个数+1
依然是升序< 是,更新。
否,上个升序个数是否历史最大。<
开新升序计数。
Paradin 2009-04-08
  • 打赏
  • 举报
回复
d
Pajack 2009-04-08
  • 打赏
  • 举报
回复
是我输入的问题。
你的代码在不考虑元素相同下是可以的!~
C1053710211 2009-04-08
  • 打赏
  • 举报
回复
忘了说输入的格式了
先输入m,测试的组数,在输入要输入的序列中数字的个数,然后输入序列
你这个可是输入
10
19
80 85 100 1 3 5 60 70 100 98 95 90 93 86 20 25 45 50 78
Pajack 2009-04-08
  • 打赏
  • 举报
回复
谢谢c1053710211,不知你有测过我给的数列没,得不到结果8的,用你的代码的结果是5.
C1053710211 2009-04-08
  • 打赏
  • 举报
回复
动态规划的经典问题,网上搜一下很多,我贴一个自己写的

#include <stdio.h>
#define len 40000
int main()
{
int m,n,i,j,mid,up,down,max;
int a[len],d[len];
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
d[0]=-1;
d[1]=a[0];
max=1;
for(i=1;i<n;i++)
{
down=0;
up=max;
while(down<=up)
{
mid=(up+down)/2;
if(d[mid]<a[i]) down=mid+1;
else up=mid-1;
}
d[down]=a[i];
if(down>max) max++;
}
printf("%d\n",max);
}
return 0;
}

这个解释起来很繁琐,建议LZ先到网上找关于动态规划的思想和原理,然后代码一看就懂
Pajack 2009-04-08
  • 打赏
  • 举报
回复
补充:子序列中允许有相同的元素.

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧