| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3861 人关注过本帖, 1 人收藏
标题:求最长递增子序列~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(1)
已结贴  问题点数:100 回复次数:21 
求最长递增子序列~
图片附件: 游客没有浏览图片的权限,请 登录注册


如题~
感觉我的思路很复杂的样子,首先要用结构体记录下标编号,通过排序进行去重~再用排序后用二分法找到要链接的下标求连通分量,最后后根据连通分量求最长路径~

虽然我知道我在讲天书,但感觉这题应该存在简单高效的算法吧希望各位大神能给出可行的参考算法~

[此贴子已经被作者于2018-3-18 15:24编辑过]

搜索更多相关主题的帖子: 最长 递增 子序列 排序 算法 
2018-03-18 15:20
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
问题是难度居然是基础题,我也是醉了,或者普通算法也能达到目的,有大神能给出一个可行能够AC的算法就可以了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-18 15:22
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:5 
稍微改了下
程序代码:
#include<stdio.h>
int main(void)
{
    int i,j,n,max,num=0,m=0;
    int count[100]={0};
    int a[100];
    scanf("%d",&n);
    for(i=0;i<n;++i)
        scanf("%d",&a[i]);
    
    for(i=0;i<n-1;++i)
        for(j=i+1;j<n;++j)
            if(a[j]>a[i])
                count[i]++;
    max=count[0];
    for(i=0;i<n;++i)
    {
        if(count[i]>max)
        {
            max=count[i];
            num=i;
        }
    }
    for(i=num+1;i<n-1;++i)
    {
        
        for(j=i+1;j<n;++j)
        {
            if(count[j]>=count[i])
            {
                max--;
                break;
            }
        }
    }
    
    if(max<=-1)
        printf("0\n");
    else
        printf("%d",max+1);
    return 0;                
}


[此贴子已经被作者于2018-3-18 18:33编辑过]

2018-03-18 16:35
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 李晨经纪人
我去看看情况,有消息和你说说,希望简单改下条件可以AC~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-18 16:53
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 4楼 九转星河
ac是什么
2018-03-18 17:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用李晨经纪人在2018-3-18 17:00:16的发言:

ac是什么

ACM题目通过了叫AC
当然我是帮我的一个同学问的,我还要等他消息,有点无语~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-18 17:30
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
测试 8(n)8 7 13 17 5 2 3 1结果为0
2018-03-18 20:52
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
下面程序能得出结果但说不上原因,有待验证
#include<stdio.h>
int main(void)
 {
     int i,j,n,max,min,num=0,count1,count2;
     int count[100]={0};
     int a[100];
     scanf("%d",&n);
     for(i=0;i<n;++i)
         scanf("%d",&a[i]);
         int pre=0,end=n-1;
     while(pre<=end)
     {
         max=a[pre];count1=0;
         for(j=pre;j<=end;++j)
             if(a[j]>max)
             {
                 max=a[j];
                 count1++;
             }
         min=a[end];count2=0;
         for(j=end;j>=pre;--j)
             if(a[j]<min)
             {
                 min=a[j];
                 count2++;
             }
         count[pre]=(count1>count2)?count1:count2;
     pre++;end--;
      
     }
     max=count[0];
     for(i=0;i<n;i++)
     {
         if(max<count[i]){
             max=count[i];
         }
     }
     
         printf("%d",max+1);
     return 0;               
 }
算法就是从头到尾,然后从尾到头也许还有漏掉的

[此贴子已经被作者于2018-3-18 20:55编辑过]

2018-03-18 20:53
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 7楼 ehszt
对的,后面出现比较小的数字时会出错。把最后的一串count[i]=0的元素删除
2018-03-18 21:12
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 7楼 ehszt
这样就不会把多余的数减掉了
2018-03-18 21:14
快速回复:求最长递增子序列~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020942 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved