zoukankan      html  css  js  c++  java
  • POJ 2479

    题目大意:在一个数字串中找到连个连续的字串(这两个字串可以相邻),使得两个字串和最大。

    思路:最大字串的变形。找出每个数字左边和最大的串,右边和最大的串, 然后左右相加算出最大的和。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #define MAX 0x6fffffff
    using namespace std;
    
    int res[50002][2],num[50002],suml[50002],sumr[50002],maxl[50002],maxr[50002];
    int ncase,n;
    
    int main(){
    	int i,j,res;
    	scanf("%d",&ncase);
    	while(ncase--){
    		scanf("%d",&n);
    		for(i=0;i<n;i++)
    		    scanf("%d",&num[i]);
    		suml[0] = num[0];
    		for(i=1;i<n;i++)
    		    if(suml[i-1] > 0)
    		        suml[i] = suml[i-1] + num[i];
    		    else
    		        suml[i] = num[i];
    	    sumr[n-1] = num[n-1];
    	    for(i=n-2;i>=0;i--)
    	        if(sumr[i+1] > 0)
    	            sumr[i] = sumr[i+1] + num[i];
    	        else
    	            sumr[i] = num[i];
    	    maxl[0] = suml[0];
    		for(i=1;i<n;i++)
    		    if(suml[i] < maxl[i-1])
    		        maxl[i] = maxl[i-1];
    		    else
    		        maxl[i] = suml[i];
    		maxr[n-1] = sumr[n-1];
    		for(i=n-2;i>=0;i--)
    		    if(sumr[i] < maxr[i+1])
    		        maxr[i] = maxr[i+1];
    		    else
    		        maxr[i] = sumr[i];
    		res = -MAX;
    		for(i=0;i<n-1;i++){
    			if(res < maxl[i] + maxr[i+1])
    			    res = maxl[i] + maxr[i+1];
    		}
    		printf("%d
    ",res);
    	}
    	return 0;
    }
    
  • 相关阅读:
    java8知识总结_2.方法引用
    Shell三剑客_1.grep
    java8知识总结_1.Lambda表达式
    javascript中的设计模式
    javascript入门学习
    css3新特性
    Html5新增了什么
    什么是Node.js
    vue项目搭建
    Git使用
  • 原文地址:https://www.cnblogs.com/jxgapyw/p/5269370.html
Copyright © 2011-2022 走看看