没有3个连续数字的数组中的最大子序列和

时间:2014-03-22 20:42:30

标签: java dynamic-programming

我必须找到一个数组中的最大总和,这样就不会有3个连续的数字 例如 3 4 5 1 2 应该给我11.(4 + 5 + 2)

我9点出门。 我正在使用动态编程,因为我希望运行时间为O(N) 这个想法是s数组将存储最大值和s1数组将存储看到的输入长度以跟踪后续数字

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class ex {       

    public static int maxSubArraySum(int a[], int size)
    {

       int s[]= new int[size+1];
       s[0]=0;
       int s1[]= new int[size+1];
       s1[0]=0;
       for (i = 1; i <= size; i++)
       {

            s1[i]= 1+s1[i-1];
            if(s1[i]<3) {
                int k=Math.max(s[i-1], a[i-1]+s[i-1]);       
                s[i]=k;
            }
            else {
                s[i]=Math.max(a[i-1], a[i-1]+a[i]);
                s1[i]=0;
            }
       }
       return s[s.length-1];
    }



    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner sc= new Scanner(System.in);
        int size=sc.nextInt();
        int a[]=new int[size];
        for(int i=0;i<size;i++) {
            a[i]=sc.nextInt();

        }
        System.out.println(maxSubArraySum(a, a.length));            

    }

}

3 个答案:

答案 0 :(得分:2)

我认为您的代码需要稍微调整,下面是您需要进行的更改

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class ex 
{       
    public static int maxSubArraySum(int a[], int size)
    {
       int s[] = new int[size+2];

       //they will form your base cases
       s[0] = 0;
       s[1] = a[0];
       s[2] = a[0] + a[1];

       for(int i = 2; i < size; i++)
       {
           s[i+1] = Math.max(a[i] + s[i-1], a[i] + a[i-1] + s[i-2]);
           s[i+1] = Math.max(s[i+1], s[i]); 
       }
       return s[size];
    }

    public static void main(String[] args) 
    {
        Scanner sc= new Scanner(System.in);
        int size=sc.nextInt();
        int a[]=new int[size];
        for(int i=0;i<size;i++) 
        {
            a[i]=sc.nextInt();
        }
        System.out.println(maxSubArraySum(a, a.length)); 
     }           
 }

希望这有帮助。

答案 1 :(得分:0)

考虑数组从索引0 ... n-1开始,即[0 ... n-1],

我们创建array table[n+1]table[i]表示从1到 i 的最大总和,没有三个连续数字。在计算table[i]时,我们必须选择是否选择 i 元素。

所以,有三个案例

案例1:因为,我们不能选择三个连续的数字,但可以选择两个连续的数字并跳过第三个。

案例2:选择 i 元素并跳过(i-1)元素。

案例3:如果我们没有选择 i 元素

因此,基于以上讨论,c ++代码如下:

int max_sum_no_three_consecutive(int a[], int n)
{
    int table[n+1];
    table[0] = 0;
    table[1] = a[0];
    table[2] = a[1];    
    for (int i = 3; i <= n; i++) table[i] = max_3(table[i-1], table[i-2] + a[i-1], a[i-1] + a[i-2] + table[i-3]); 
        return table[n];
}

答案 2 :(得分:0)

这是一个古老的帖子,但想到回答这个问题。

for(int i = 0; i < input.length; i++) {
    if(0 == i) {
        sum[i] = input[0];
    } else if(1 == i) {
        sum[i] = input[0] + input[1];
    } else if(2 == i){
        sum[i] = getMaxOf3(sum[i - 1], sum[i-2] + input[i], input[i] + input[i - 1]);
    } else {
        sum[i] = getMaxOf3(sum[i - 1], sum[i - 2] + input[i], sum[i - 3] + input[i] + input[i - 1]);
    }
}

int getMaxOf3(int x, 
                 int y, 
                        int z) {
    return Math.max(Math.max(x, y), z);
}

<强>解释

Consider the array: {3, 4, 5, 1, 2}
we need to first have some default values for the result array.
sum[0] = array[0];
sum[1] = array[0] + array[1];
sum[2] = maximum of either (arr[0] + arr[1]) or (arr[1] + ar[2]) or (arr[0] + arr[2])

We calculated 3 sums,as we will be using these for furthur sum calculations.
    sum[3] = max(sum[2], sum[1] + arr[3], sum[0] + arr[3] + arr[2]);
This reduces to,
sum[i] = max(sum[i - 1], sum[i - 2] + arr[i], sum[i - 3] + arr[i] + arr[i - 1]);