長さがn
の配列が与えられている場合、配列の2つ以上の連続する要素を選択することができない場合に選択できる要素の最大合計を見つける必要があります。例えば;配列からの最大サブ配列の選択
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