zoukankan      html  css  js  c++  java
  • 九度 1011 最大连续子序列和

    穷举,确定好子数组的开始与结束

    public int maxSubArray(int[] nums){
            int sum = 0, max = 0, start = 0, end = 0;
            for(int i = 0, len = nums.length;i < len;i ++){
                for(int j = i; j < len;j ++){
                    sum = 0;
                    for(int k = i;k <= j;k ++){
                        sum += nums[k];
                    }
                    if(sum > max){
                        max = sum;
                        start = i;
                        end = j;
                    }
                }
            }
            System.out.println(start + "==" + end);
            return max;
        }

    动态规划

    public int maxSubArray(int[] nums){
            int sum = 0, max = nums[0];
            for(int i = 0, len = nums.length;i < len;i ++){
                sum += nums[i];
                if(sum > max){
                    max = sum;
                }
                if(sum < 0){
                    sum = 0;
                }
            }
            return max;
        }
    /*
     * MaxSum.cpp
     *
     *  Created on: 2014-5-6
     *      Author: wangzhu
     */
    
    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define LL long long
    #define NMAX 10001
    int num[NMAX];
    void solve1() {
        int t, start, end, first;
        LL sum, nmax;
        while (~scanf("%d", &t) && t) {
            for (int i = 0; i < t; i++) {
                scanf("%d", num + i);
            }
            //first:记录最大连续子序列和的第一个数的位置, start:记录最大连续子序列和的第一个数的位置 end:记录最大连续子序列和的最后一个数的位置
            first = start = end = 0;
            //sum:记录连续子序列的和 nmax:记录最大连续子序列的和
            sum = nmax = num[0];
    
            for (int i = 1; i < t; i++) {
                if (sum < 0) {
                    //若和小于0,则更新子序列和,以及开始记录位置
                    sum = num[i];
                    first = i;
                } else {
                    //反之,则继续加
                    sum += num[i];
                }
    
                if (sum > nmax) {
                    //当前子序列和大于最大子序列和时,更新最大自序列和,并该序列的更新起始位置
                    nmax = sum;
                    start = first;
                    end = i;
                }
            }
            if (nmax < 0) {
                nmax = 0;
                start = 0, end = t - 1;
            }
            printf("%lld %d %d
    ", nmax, num[start], num[end]);
        }
    }
    
    void solve2() {
        int t, start, end;
        LL sum[NMAX], nsum;
        while (~scanf("%d", &t) && t) {
            for (int i = 0; i < t; i++) {
                scanf("%d", num + i);
            }
            sum[0] = num[0];
            for (int i = 1; i < t; i++) {
                if (sum[i - 1] > 0) {
                    sum[i] = sum[i - 1] + num[i];
                } else {
                    sum[i] = num[i];
                }
            }
            end = 0;
            nsum = sum[0];
            for (int i = 1; i < t; i++) {
                if (sum[i] > nsum) {
                    nsum = sum[i];
                    end = i;
                }
            }
            if (nsum < 0) {
                nsum = 0, start = 0, end = t - 1;
            } else {
                start = end;
                for (int i = end - 1; i >= 0; i--) {
                    if (sum[i] >= 0) {
                        start = i;
                    } else {
                        break;
                    }
                }
            }
            printf("%lld %d %d
    ", nsum, num[start], num[end]);
        }
    }
    int main() {
    //    freopen("data.in", "r", stdin);
        solve2();
        return 0;
    }
  • 相关阅读:
    面试生信工程师2
    R语言矩阵相关性计算及其可视化?
    PCA方差解释比例求解与绘图?
    MySQL 练习
    oracle高级数据查询技术
    Oracle安全管理
    基本查询语句
    管理表
    oracle PL/SQL高级编程
    oracle视图与索引
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/3710786.html
Copyright © 2011-2022 走看看