找到最小总和,使得没有两个元素相邻

时间:2014-11-30 11:30:04

标签: c arrays algorithm data-structures

我已编写此代码以查找最大总和,使得没有两个元素相邻,现在我想将此代码转换为查找最小总和,使得没有两个元素使用相同的逻辑相邻。

请告诉我该怎么做?

    #include<stdio.h>

/*Function to return max sum such that no two elements
 are adjacent */
int FindMaxSum(int arr[], int n)
{
  int incl = arr[0];
  int excl = 0;
  int excl_new;
  int i;

  for (i = 1; i < n; i++)
  {
     /* current max excluding i */
     excl_new = (incl > excl)? incl: excl;

     /* current max including i */
     incl = excl + arr[i];
     excl = excl_new;
  }

   /* return max of incl and excl */
   return ((incl > excl)? incl : excl);
}

/* Driver program to test above function */
int main()
{
  int arr[] = {5, 5, 10, 100, 10, 5};
  printf("%d \n", FindMaxSum(arr, 6));
  getchar();
  return 0;
}

2 个答案:

答案 0 :(得分:0)

您可以使用此策略使用递归:

  1. 删除最后两个元素。
  2. 在当前元素中找到您的条件的最小(最大)序列。我把它命名为Sum2。
  3. 在步骤2中将最后一个元素添加到Sum2:
    • 如果总和越低(找到最大值越高),否则不要将其添加到Sum2。
  4. 删除最后三个元素。
  5. 在当前元素中找到您的条件的最小(最大)序列。我把它命名为Sum3。
  6. 在步骤5中将最后一个元素之前的元素添加到Sum3:

    • 如果总和越低(找到最大值越高),否则不要将其添加到Sum3。
  7. 比较sum2和sum3,你得到答案:)

  8. 例如,在序列中找到最大值:{5, 5, 10, 100, 10, 5}

    我将序列缩减为{5, 5, 10, 100}

    现在最大值为:5+100 = 105 = sum2

    然后我将最后一个元素添加到sum2,因此我之前有sum2 = 110且大于sum2,所以我保留了它。

    现在我将序列缩减为{5, 5, 10}

    最大值为5+ 10 = 15 = sum3

    现在我将最后一个元素之前的元素添加到sum3,我有sum3 = 10 + 15 = 25。它比以前更大所以我保留它。

    现在sum2>sum3所以最大的序列是5 100 5 = 110

答案 1 :(得分:-1)

您问题的典型重现是

  

f(n)= max / min(arr [n] + f(n - 2),f(n - 1))

可以使用动态编程在线性时间内求解。要强制获取第一个元素,只需采用它并考虑数组其余部分的动态编程方法。

一个简单的实现如下:

int find_min(int arr[], int n) {
  int a = 0, b = 0;
  for (int i = 1; i < n; ++i) {
    int c = max/min(arr[i] + a, b); //Put max or min and it will work
    a = b;
    b = c;
  }
  return b + arr[0];
}

在此代码中,我将 f(n - 2)存储在 a 中, f(n - 1)存储在 b中。所以最后, b 包含答案。

我也认为你在你的代码中做了同样的事情(虽然不确定),所以如果我正确地猜测你在做什么,下面应该有效:

int FindMinSum(int arr[], int n)
{
  int incl = arr[1];
  int excl = 0;
  int excl_new;
  int i;

  for (i = 2; i < n; i++)
  {
     /* current max excluding i */
     excl_new = (incl < excl)? incl: excl;

     /* current max including i */
     incl = excl + arr[i];
     excl = excl_new;
  }

   /* return max of incl and excl */
   return ((incl < excl)? incl : excl) + arr[0];
}