Mi sono imbattuto in questa domanda. Dato un array contenente solo valori positivi, si desidera massimizzare la somma degli elementi scelti sotto il vincolo che nessun gruppo di più di k elementi scelti sono adiacenti. Ad esempio se l'input è 1 2 3 1 7 9 (n = 6 e k = 2). L'uscita sarà il 21, che proviene dalla raccolta degli elementi _ _ 2 3 7 9. La mia soluzione semplice DP è questoAlgoritmo per trovare la somma massima di elementi in una matrice tale che non più di k elementi sono adiacenti
#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));
}
Ma io non sono sicuro se questa è la soluzione efficace. La complessità può essere ulteriormente ridotta? Grazie per il vostro aiuto
"impossibile scegliere più di k elementi adiacenti" è confuso. Vuoi dire "non puoi scegliere più di k elementi, e devono essere adiacenti" o intendi "puoi sceglierne quanti ne vuoi, purché nessun gruppo di più di k sia adiacente"? –
Ho aggiornato la domanda, è chiaro dall'esempio che intendeva quest'ultimo. –
Sono questi compiti? Se è così, dovrebbe essere taggato come tale. – Perry