| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1163 人关注过本帖
标题:高手们,给个思路就行,谢谢各位了.
只看楼主 加入收藏
冰兵
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2010-7-13
收藏
得分:0 
回复 6楼 handong0823
    这个也不对啊,好像不符合例题啊,就不必说通用性了啊。
2010-07-27 10:52
冰兵
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2010-7-13
收藏
得分:0 
回复 2楼 vs_inzaghi
问一下,不用链表用数组的思路呢
2010-07-27 11:00
冰兵
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2010-7-13
收藏
得分:0 
回复 2楼 vs_inzaghi
如果例子没有10呢?最后一个数是1哪最大的就是9了  但最长的子序列是 1,2,5,6,7,8。这个怎么解释呢?谢谢啦啊
2010-07-27 11:08
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:2 
你可能理解错了
二楼就明白了
不只有b[],c[]
还有d[],f[]............
所以呢见一个二维数组就能解决

ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-07-27 11:14
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:1 

误人子弟

[ 本帖最后由 encounter 于 2010-7-27 16:42 编辑 ]

ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-07-27 11:21
王璐
Rank: 2
等 级:论坛游民
帖 子:126
专家分:54
注 册:2010-7-26
收藏
得分:0 
弱弱地问下,为什么会出现8呢?最长单调递增子序列是什么意思?
2010-07-27 12:11
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:2 
可看作是子集
不过得满足2个条件
1不能改变顺序
2递增
最后比较一下谁最长不就行了么

郁闷回答了这么多问题
只有一人加点
很是郁闷


原来是有原因的


[ 本帖最后由 encounter 于 2010-7-27 17:06 编辑 ]

ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-07-27 15:34
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:1 
要不我给你写个

ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-07-27 15:37
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:0 
误人子弟了
又想到一个
例{1,2,5,3,4,9,7,8,6}
如果有一大数在前面,它到底要不要加入这个子序列,要看他后面有没有 多个 比他小且单调递增的数
如果有换掉这个大数,1,2,5,3,4
5则要舍弃
{1,5,6,2,3,4,}
如有多个大数在前  比他小且单调递增的数 要多于大数 个数 才能把大数换掉
这样的数列一定最长且满足条件,




ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-07-27 17:03
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:5 
#include<stdio.h>
int a[]={13, 15, 12, 28, 17, 33, 2, 29, 34, 30};
int b[20];//存放以a[i](0<=i<=a.length-1)为最后元素的最大递增子串的长度。
int num = 10;//num为a数组的长度
int k;//存放最大递增子串最后一个元素的下标

//求出b[i]中最大的值(即是最大递增子串的长度),并将其下标存在k中
int Max() {
    int temp = 0;
    for (int i = 0; i < num; i++) {
        if (b[i] > temp) {
            temp = b[i];
            k = i;
        }
    }
    return temp;
}

// 以a[i](0<=i<=a.length-1)为最后元素的最大递增子串的长度存到b[i]中
int Lis() {
    b[0] = 1;//以a[0]为最后元素的子串只有a[0],所以长度为1.
    int k;
    for (int i = 1; i < num; i++) {
        k = 0;
        for (int j = 0; j < i; j++) {
            if (a[j] <= a[i] && k < b[j]) {
            //比较所有小于a[i]并位于a[i]前面的最大子串的长度。比如3 6 4 5,那么以5结尾的最大子串长度
            //等于:max{(小于5的元素有3,4)3的最大子串长度,4的最大子串长度}+1;
                k = b[j];
            }
        }
        b[i] = k + 1;//max{(小于5的元素有3,4)3的最大子串长度,4的最大子串长度}+1;
    }
    return Max();
}

//从大到小输出递增子串
void print(int index){
    printf("%d ",a[index]);  
    for (int i = 0; i < index; i++) {
        if (b[i] == b[index] - 1 && a[i] <= a[index]) {
            print(i);
            break;
        }
    }
}

void main(){
    printf("最大递增子串的长度为:%d\n",Lis());
    printf("最大递增子串从大到小输出为:\n");
    print(k);
}

[ 本帖最后由 linjx0123 于 2010-7-27 17:42 编辑 ]
2010-07-27 17:40
快速回复:高手们,给个思路就行,谢谢各位了.
数据加载中...
 
   



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

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