最大连续/最大不连续

最大连续乘积子数组:

#include<iostream>
#include<string>
using namespace std;
int a[1010];
int main()
{
	int n;
	cin>>n;
	
	for(int i=0;i<n;i++)
	   cin>>a[i];
	    
    	int last_max = a[0];
    	int last_min = a[0];
    	int result = a[0];
    	int cur_max = a[0];
    	int cur_min = a[0];
    	
    	for(int i = 1; i < n; i ++)
    	{
    		cur_max = max(a[i], max(last_max * a[i], last_min * a[i]));
    		cur_min = min(a[i], min(last_max * a[i], last_min * a[i]));
    		result = max(result, cur_max);
    		last_max = cur_max;
    		last_min = cur_min;
		}
		
	cout<<result<<endl;
    
    return 0;
}

  最大连续子串

#include <iostream>
using namespace std;

//N是数组长度,num是待计算的数组,放在全局区是因为可以开很大的数组
int a[134217728];

int main()
{
    int n;
    cin>>n;
    for(int i = 0; i < n; i++)
        cin>>a[i];
      
    int ans = a[1];
    for(int i = 1; i <= n; i++) 
	{
        if(a[i-1] > 0) 
		        a[i] += a[i - 1];
        else 
		      a[i] += 0;
		      
        if(a[i] > ans) 
		      ans = a[i];
    }
    cout<<ans;
    return 0;
}

  

/*
    最大连续子序列和 
*/

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

#define maxn 10010
int A[maxn], dp[maxn];    // A[i] 存放序列,dp[i] 存放以 A[i] 为结尾的连续序列的最大和 

// 求较大值
int max(int a, int b) {
    return a>b ? a : b; 
} 

int main() {
    int n, i, k;
    scanf("%d", &n);
    for(i=0; i<n; ++i) {        // 输入序列 
        scanf("%d", &A[i]);
    }

    dp[0] = A[0];                // 边界
    for(i=1; i<n; ++i) {
        
        dp[i] = max(A[i], dp[i-1] + A[i]);// 状态转移方程 
    } 
   
    k = dp[0];                     // 求最大连续子序列和 
    for(i=1; i<n; ++i) {
        if(dp[i] > k) {
            k = dp[i];
        }
    }
    printf("%d\n", k);        // 输出 

    return 0;
}

  

posted @ 2018-10-24 23:08  道微真理  阅读(96)  评论(0)    收藏  举报