将序列划分为最多K个连续的大小集

时间:2012-04-04 15:17:39

标签: algorithm

将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;
}

1 个答案:

答案 0 :(得分:0)

因为它听起来像是家庭作业,所以我只想给你一个线索。使用带有函数的动态编程:F(x,i,k)其中x是序列,你正在考虑第一个i元素,k是不相交的子序列的数量。