Tôi đã xem qua câu hỏi này. Cho một mảng chỉ chứa các giá trị dương, bạn muốn tối đa hóa tổng các phần tử được chọn theo ràng buộc mà không có nhóm nào nhiều hơn k các phần tử được chọn liền kề. Ví dụ, nếu đầu vào là 1 2 3 1 7 9 (n = 6 và k = 2). Kết quả sẽ là 21, xuất phát từ các yếu tố chọn _ 2 3 _ 7 9. giải pháp DP đơn giản của tôi là nàyThuật toán để tìm tổng số phần tử tối đa trong một mảng sao cho không quá k phần tử nằm liền 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));
}
Nhưng tôi không chắc chắn cho dù đây là giải pháp hiệu quả. Sự phức tạp có thể giảm thêm nữa không? Nhờ sự giúp đỡ của bạn
"không thể chọn nhiều hơn k yếu tố lân cận" là khó hiểu. Bạn có nghĩa là "không thể chọn nhiều hơn k yếu tố, và họ phải được liền kề" hoặc bạn có nghĩa là "có thể chọn bao nhiêu tùy thích, miễn là không có nhóm nào nhiều hơn k liền kề"? –
Tôi đã cập nhật câu hỏi, rõ ràng từ ví dụ mà anh ta muốn nói đến sau. –
Đây có phải là bài tập về nhà không? Nếu vậy, nó sẽ được gắn thẻ như vậy. – Perry