zoukankan      html  css  js  c++  java
  • poj 2479 Maximum sum

    题意:求一段整数序列任意两端不相交的串的和的最大值。

    题目思路:用dp动态规划,先开辟一个标志数组从左到右分别记录每一段序列和的最大值,再从右到左分别根据已经记录好的标志数组计算最大和的值。

    #include<iostream>
    #include<stdio.h>
    
    using namespace std;
    int flag[50001],num[50001];//两个数组分别记录最大和和这个整数序列
    const int MIN=-999999999;
    int main(){
        int n;
        int ans,i,j;
        int sum,temp;
        int per;
        cin>>n;
        while(n--){
    
    
            sum=0,temp=MIN;
            cin>>per;
            for(i=1;i<=per;i++){//从左到右
                scanf("%d",&num[i]);
                sum+=num[i];
                if(sum>temp) {temp = sum;}//分别选出1~i段的最大和,只有所有元素相加的和大于原来的最大和才更新这个最大和
                flag[i]=temp;
                if(sum<0) sum=0;//如果sum出现了负数,就抛弃这一段
    
            }
            sum=0;
            ans=MIN;
            temp=MIN;
            for(j=per;j>1;j--){//从右到左
                sum+=num[j];
                if(sum>temp) temp=sum;
                if(ans<flag[j-1]+temp) ans=temp+flag[j-1];//序列中的元素和分别与记录好的各段最大和相加,选出其中最大值即为所求
                if(sum<0)sum=0;
            }
            printf("%d
    ",ans);
    
        }
        return 0;
    }
  • 相关阅读:
    Java WebSocket生命周期
    软件网络总结
    js模态弹窗
    spring boot
    spring aop
    lvs分布式
    如何在大牛面前装逼
    Java学习的思考
    javase知识点
    <nginx+PHP>nginx环境下配置支持php7
  • 原文地址:https://www.cnblogs.com/jokerspace/p/6751922.html
Copyright © 2011-2022 走看看