| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1518 人关注过本帖
标题:请各位大佬帮忙看看这题,谢谢!
只看楼主 加入收藏
Jason_
Rank: 2
来 自:浙江台州
等 级:论坛游民
帖 子:88
专家分:66
注 册:2019-7-14
结帖率:66.67%
收藏
 问题点数:0 回复次数:2 
请各位大佬帮忙看看这题,谢谢!
题目描述
从n个数中取出若干个数,可以连续取1个,也可以连续取2个,但连续取的数不能有3个或多于3个。问取到的最大的和是多少?


输入
第1行:一个整数n(1<=n<=10000)。
第2行:空格隔开的n个整数ai(1<=ai<=100000)。


输出
一行,1个整数,表示取到的最大和。
搜索更多相关主题的帖子: 个数 整数 空格 输出 表示 
2019-08-19 19:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
题目链接呢?

从某个位置起,共有三种取值方案,即:
a. 不取
b. 取一个,不取
c. 取两个,不取
用递归写的话,非常简单,但运行效率一定很低,需要剪枝。

当到达某个位置时,不管是怎么来的,都只需要取“累加和”最大的就行(相当于剪枝)
程序代码:
#include <cstdio>

unsigned foo( const unsigned buf[], size_t n )
{
    unsigned record[3] = { 0, 0, 0 };

    for( size_t i=0; i!=n; ++i )
    {
        unsigned tmp = record[0];
        record[0] = record[1];
        record[1] = record[2];

        {
            if( record[0] < tmp )
                record[0] = tmp;
        }

        {
            if( record[1] < tmp+buf[i] )
                record[1] = tmp+buf[i];
        }

        if( i+1 < n )
        {
            if( record[2] < tmp+buf[i]+buf[i+1] )
                record[2] = tmp+buf[i]+buf[i+1];
        }
    }

    return record[0]<record[1]?record[1]:record[0];
}

int main( void )
{
    size_t n;
    unsigned buf[10000];

    scanf( "%zu", &n );
    for( size_t i=0; i!=n; ++i )
        scanf( "%u", buf+i );

    printf( "%u\n", foo(buf,n) );
}


2019-08-20 10:46
神犇dengyuhy
Rank: 2
等 级:论坛游民
帖 子:17
专家分:22
注 册:2019-8-19
收藏
得分:0 
2019-08-20 18:12
快速回复:请各位大佬帮忙看看这题,谢谢!
数据加载中...
 
   



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

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