3583. 整数分组 (双指针+dp)

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3583. 整数分组 (双指针+dp)相关的知识,希望对你有一定的参考价值。

链接

题意:

给定 n 个整数 a1,a2,…,an。

现在,请你从中挑选一些数,并将选出的数进行分组。

要求:

  1. 选出的数最多划分为 k 组(至少 1 组)。
  2. 同一组内,任意两数之差的绝对值不超过 5。
  3. 所选出的数尽可能多。

请问,最多可以选出多少个数进行分组?

代码:

#include<bits/stdc++.h>
using namespace std;
int w[5010];
int f[5010][5010];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&w[i]);
    }
    sort(w+1,w+1+n);
    for (int i = 1, k = 1; i <= n; i ++ )
    {
        while (w[i] - w[k] > 5) k ++ ;
        for (int j = 1; j <= m; j ++ )
            f[i][j] = max(f[i - 1][j], f[k - 1][j - 1] + (i - k + 1));
    }
    printf("%lld\\n",f[n][m]);
    return 0;
}

以上是关于3583. 整数分组 (双指针+dp)的主要内容,如果未能解决你的问题,请参考以下文章

3583. 整数分组

Codeforces Round #544 (Div. 3) dp + 双指针

BZOJ4927第一题 双指针+DP(容斥?)

洛谷 P1094 纪念品分组贪心/双指针

2021夏季每日一题 week3 完结

DP 分组整数分组