C++学习(1):最大子段和(多种解法)

问题:给定由n个数(可能为负数)组成的序列a1,a2,a3,...,an,求该序列子段和的最大值。

第一种解法:(最容易考虑的方法,将所有的子段一一相加,然后比较)

 1 #include<iostream>
 2 using namespace std;
 3 int Maxsum(int n,int *a,int &besti,int &bestj)
 4 {
 5     int sum = 0;
 6     for(int i=1;i<=n;i++)
 7     {
 8         int thissum = 0;
 9         for(int j=i;j<=n;j++)
10         {
11             thissum +=a[j];
12             if(thissum>sum)
13             {
14                 sum = thissum;
15                 besti = i;
16                 bestj = j;
17             }
18         }
19     }
20     return sum;
21 }
22
23 int main()
24 {
25     int Case = 1;
26     int T;//共有多少组数
27     cin>>T;
28     while(T>0)
29     {
30         T--;
31         int sum;
32         int N = 9;//一组有多少个数据
33         cin>>N;
34         int* array = new int[N+1];
35         for(int i=1;i<=N;i++)
36         {
37             cin>>array[i];
38         }
39         int besti,bestj;
40         sum = Maxsum(N,array,besti,bestj);
41         cout<<"Case "<<Case<<":"<<endl;
42         cout<<sum<<" "<<besti<<" "<<bestj<<endl;
43
44         if(T>0)
45         {
46             cout<<endl;
47         }
48         Case++;
49     }
50     return 0;
51 }
时间: 2024-10-14 08:07:29

C++学习(1):最大子段和(多种解法)的相关文章

ACM中杨辉三角的多种解法

杨辉三角的多种解法 杨辉三角的相信大家很熟悉吧,但是大家能用多少中方法写出来呀,一般人都只会想到两种,递归和二项式.当用递推时,有时在解题是根本没必要需要那么多呀,而只要杨辉三角的某一行,数据小时,我们可以用二项式来计算,但是数据比较大时,二项式算也是很麻烦的,那么还有其它的方法吗?所以下面我就介绍几种计算杨辉三角的方法吧. 主要要记住第四种.... 完整版下载:http://download.csdn.net/detail/u010304217/7750997 博客版下载:http://dow

编程之美问题之二叉树层序遍历多种解法

二叉树的层序遍历(要求区分层,例如每层遍历完输出换行) 单单层序遍历非常简单,一个队列就搞定了,但是区分层则要麻烦些.总的思路无非就是在每次print的时候,要能通过某个东西 区分出当前节点是否是一层最后一个节点,或者下一层的最后一个节点,感觉有点类似于机器学习中找个区分度明显的特征: 1.自己的解法,在单队列基础上,输入队列的数据添加一个标志 ,LevelHeaded,同时,在后面插入两个孩子的时候,判断是否这次输出的是队头,如果是的话,先插 个队头标志,再插入孩子,而且插入一次之后,后面不能

算法笔记_001:斐波那契数的多种解法

本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第几个斐波那契数.(Java: 231-1 for int, 263-1 for long) 解决方案:针对问题1,此处要使用迭代法来解决,具体实现代码如下: //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数 public static int max_int_iter

[leetcode] Longest Palindromic Substring 多种解法

很经典的题目,求字符串中的最长回文子串. (1)最朴素的解法 ---暴力 复杂度O(N3) 这也是最容易想到的方法,最外层循环枚举起点i,第二层循环从i+1开始向后枚举,第三层判断是不是回文串.最后取最长子串的返回. 代码比较简单,这里没有列出. (2)中心扩展法.复杂度O(N2) 枚举每一个字符作为中心点向左右扩展.但是这里要注意,对于每一次扩展要分奇偶两种情况.否则可能会漏掉情况. 一发现不满足的情况马上break进行下一个中心字符的判断,代码如下: class Solution { pub

一道百度面试题的多种解法

题目 java程序,主进程需要等待多个子进程结束之后再执行后续的代码,有哪些方案可以实现? 这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功,欢迎大家批评指正. 解法 1.join方法 使用Thread的join()等待所有的子线程执行完毕,主线程在执行,thread.join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A

寻找数组中的第K大的元素,多种解法以及分析

遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因为不要求别的信息只要计算出第K大的元素.当然,如果在某种情况下需要频繁访问第K大的元素就可以先进行一次排序在直接得出结果. 第一种方式是这样,用选择排序,冒泡法,或者交换排序这类的排序,对前K个元素进行排序.这三种算法也许不是最快的排序算法.但是都有个性质:计算出最大(小)的元素的算法复杂度是O(N

字符串反转的多种解法

import java.util.Stack; public class StringReverse {    public static String reverse1(String s) {   int length = s.length();   if (length <= 1)    return s;   String left = s.substring(0, length / 2);   String right = s.substring(length / 2, length);

Netty4.0学习笔记系列之六:多种通讯协议支持

上文介绍了如何应用Netty开发自定义通讯协议,本文在此基础上进一步深化,研究如何同时支持不同的通讯协议. 此处所谓的通讯协议,指的是把Netty通讯管道中的二进制流转换为对象.把对象转换成二进制流的过程.转换过程追根究底还是ChannelInboundHandler.ChannelOutboundHandler的实现类在进行处理.ChannelInboundHandler负责把二进制流转换为对象,ChannelOutboundHandler负责把对象转换为二进制流. 接下来要构建一个Serve

Create Phone Number (多种解法)

题目: Create Phone Number Description: Write a function that accepts an array of 10 integers (between 0 and 9), that returns a string of those numbers in the form of a phone number. Example: createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) // => retur