私はこの問題に遭遇しました。正の値のみを含む配列が与えられた場合、選択したk個以上の要素のグループが隣接していないという制約の下で、選択された要素の合計を最大にしたいとします。たとえば、入力が1 2 3 1 7 9(n = 6、k = 2)の場合出力は、要素を選んでから来ている21、_ 2 3 _ 7 9.私の簡単なDPソリューションは、このk個以下の要素が隣接しているような配列の要素の最大和を求めるアルゴリズム
#include<stdio.h>
#include<limits.h>
#include<malloc.h>
long maxsum(int n,int k,long *sums){
long *maxsums;
maxsums = malloc(sizeof(long)*n);
int i;
long add = 0;
for(i=n-1;i>=n-k;i--){
add += sums[i];
maxsums[i] = add;
}
for(i = n-k-1;i>=0;i--){
int j;
long sum =0,max = 0,cur;
for(j=0;j<=k;j++){
cur = sum;
if((i+j+1)<n)
cur += maxsums[i+j+1];
if(cur > max) max = cur;
sum += sums[i+j];
}
maxsums[i] = max;
}
return maxsums[0];
}
int main(){
int cases=0,casedone=0;
int n,k;
long *array;
long maxsum = 0;
fscanf(stdin,"%d %d",&n,&k);
array = malloc(sizeof(long)*n);
int i =0;
while(casedone < n){
fscanf(stdin,"%ld",&array[casedone]);
casedone++;
}
printf("%ld",maxsum(n,k,array));
}
あることでしょう。しかし、私は、これは効率的なソリューションであるかどうかを確認していません。複雑さをさらに減らすことはできますか?おかげであなたの助け
"隣接するk個以上の要素を選択できません"というのは混乱します。あなたは "k個以上の要素を選ぶことができず、それらは隣接していなければならない"という意味ですか、あるいは "k個以上のグループが隣接していない限り、好きなだけ多くを選ぶことができる"という意味ですか? –
私は質問を更新しました。後者を意味する例から明らかです。 –
この宿題はありますか?もしそうなら、そのようにタグ付けされるべきです。 – Perry