【问题标题】:Maximum subsequence sum in an array with no 3 consecutive number没有 3 个连续数字的数组中的最大子序列和
【发布时间】:2014-04-30 06:28:29
【问题描述】:

我必须在一个数组中找到最大和,使得没有 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));            

    }

}

【问题讨论】:

  • 问题是什么?
  • Given 是一系列不同的正数。我们希望找到一个具有最大可能和的子序列,但限制是我们不能从原始序列中取三个连续的元素。例如,对于输入 1、6、5、2、7、9、3、4,具有最大可能和的子序列是 6、5、7、9、4(我们有两对连续元素 6、5 和7, 9 但不是三个连续的元素)。
  • 这仍然不是问题。这只是你被赋予的任务。您在哪个部分遇到了问题?
  • 在 3 4 5 1 2 的例子中。我的代码取 3 4 2 并给我 9。它应该给 4 5 2 =11。我认为当我位于数组中的第三个元素时,我没有正确找出最大值

标签: java dynamic-programming


【解决方案1】:

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

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)); 
     }           
 }

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    考虑数组从索引 0...n-1 开始,即 a[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];
    }
    

    【讨论】:

      【解决方案3】:

      这是一个旧帖子,但想回答这个问题。

      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]);
      

      【讨论】:

        猜你喜欢
        • 2021-01-21
        • 2020-01-22
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 2016-12-29
        • 2013-09-13
        相关资源
        最近更新 更多