給定一個長度爲n
的數組,如果不允許選擇超過兩個連續的陣列元素,則需要找到可以選擇的元素的最大總和。例如;從陣列中選擇最大子陣列
n=5;
arr[5] = {10,3,5,7,3};
Output : 23
10+3+7+3=23
所以我寫了這段代碼;
#include <stdio.h>
#include <stdlib.h>
int max=0;
void solve(int arr[],int ind,int sum,int n,int count)
{
if(ind==n){
if(sum>max)
max=sum;
}
else{
sum+=arr[ind];
if(ind==n-1)
solve(arr,ind+1,sum,n,1);
if(ind==n-2 && count>1)
solve(arr,ind+2,sum,n,1);
if(ind<n-1 && count<2){
count++;
solve(arr,ind+1,sum,n,count);
}
if(ind<n-2)
solve(arr,ind+2,sum,n,1);
if(ind<n-3)
solve(arr,ind+3,sum,n,1);
}
}
int main()
{
int n;
scanf("%d",&n);
int i=0,arr[n];
while(i<n){
scanf("%d",&arr[i]);
i++;
}
int count=1;
//going into all three possibilities
solve(arr,0,0,n,count);
solve(arr,1,0,n,count);
solve(arr,2,0,n,count);
printf("%d\n",max);
return 0;
}
此程序產生預期的輸出,用於n<1000
但示出了用於放大輸入運行時錯誤(SIGSEGV)。可能是什麼原因? 更有效的解決方案,也歡迎.....
也許堆棧溢出是由太深的遞歸引起的?但是這個數字可能太小而不能導致它呢? – MikeCAT
請先嚐試使用調試器來確定引起SIGSEGV的位置。 – MikeCAT
它給出了'n <200000'和'arr [i] <10000' ....它會導致溢出。 – yobro97