将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;
}
答案 0 :(得分:0)
因为它听起来像是家庭作业,所以我只想给你一个线索。使用带有函数的动态编程:F(x,i,k)其中x是序列,你正在考虑第一个i元素,k是不相交的子序列的数量。