我已编写此代码以查找最大总和,使得没有两个元素相邻,现在我想将此代码转换为查找最小总和,使得没有两个元素使用相同的逻辑相邻。
请告诉我该怎么做?
#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;
}
答案 0 :(得分:0)
您可以使用此策略使用递归:
在步骤5中将最后一个元素之前的元素添加到Sum3:
比较sum2和sum3,你得到答案:)
例如,在序列中找到最大值:{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];
}