将 N 个数的序列划分为最大为 K 的连续集合,使得没有两个集合是彼此相邻的(即,两个集合之间至少有一个数字)以及所有集合中所有元素的总和集得到最大化。
例如,如果序列是 1,2,3,4,5。我们可以将其分为集合 (1,2) 和 (4,5),因为 3 在它们之间,但不能分为集合 (2,3) 和 (4,5)。
我已经完成了这个 O(NK)。请提出更好的算法。
我已经使用了带有回溯的动态编程。我的代码是:
#include<cstdio>
using namespace std;
long long int max(long long int a,long long int b){
if(a>b) return a;
else return b;
}
int main(){
int n,k;
int p[100000];
long long int v[100001];
scanf("%d %d",&n,&k);
int i,j;
for(i=0;i<n;i++)
scanf("%d",&p[i]);
v[0]=0;
v[1]=p[n-1];
int l=1;
for(i=n-2;i>-1;i--){
long long int temp=v[l];
l=(n-i)>k?k:(n-i);
int m=(k-i)>1?(k-i):1;
for(j=l;j>=m;j--)
v[j]=max(p[i]+v[j-1],temp);
v[0]=temp;
}
printf("%lld\n",v[k]);
return 0;
}