原文链接https://www.cnblogs.com/zhouzhendong/p/CF1110D.html

题意

  给定 n 个数,每一个数都是在 [1,m] 里的整数。

  从中取出形如 {x,x,x} 或者 {x-1,x,x+1} 的集合,各个集合不能相交,问最多能取出几个。

  $n,m\leq 10^6$

题解

  标算非常简洁。

  我这里讲讲我的做法,尽管相对复杂。

  首先,我们可以忽略对于同一个 x ,取出大于2次 {x-1,x,x+1} 这种情况,因为这种可以用取 {x-1,x-1,x-1} {x,x,x} {x+1,x+1,x+1} 来代替。

  所以一个x 最多被形如 {a-1,a,a+1} 的pair 取 6 次。即 {x-2,x-1,x}*2   , {x-1,x,x+1}*2 ,  {x,x+1,x+2}*2  。

  现在来证明一个重要结论:

  如果 x 的个数大于 7 ,那么至少可以取出一次 {x,x,x} 。(也就是说我们可以先不断取 {x,x,x} 这种pair,直到所有数字的出现次数都小于等于7)

  设 t[x] 表示 x 的出现次数。

  对于 t[x] = 8 的情况,考虑到它最多被形如 {a-1,a,a+1} 的这种pair取到6次,所以如果不取 {x,x,x} ,至少会多出2个。如果取了 {x,x,x} ,那么最多会影响一个形如 {a-1,a,a+1} 的pair,导致另外两个数不能取了,但是如果不取 {x,x,x} 也会多出两个,所以至少不亏。

  对于 t[x]>8 的情况就更加显然了。

  于是现在 t[x] < 8 。 考虑 dp ,设 dp[i][j][k] 表示  [1,i] 中,i 被取了 j 次, i + 1 被取了 k 次,且 [1,i-1] 的数被取的次数没有超限,  [i+2,m] 的数没有被取过, 这种情况下取出的pair的最大个数。直接枚举转移暴力dp就好了。

  时间复杂度 O(n) *  大常数。

  实测可过。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){LL x=0,f=0;char ch=getchar();while (!isdigit(ch))f|=ch=='-',ch=getchar();while (isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return f?-x:x;
}
const int N=1000005;
int n,m;
int t[N],ans=0;
int dp[N][8][8];
void ckmax(int &x,int y){x=x>y?x:y;
}
int main(){n=read(),m=read();for (int i=1;i<=n;i++)t[read()]++;for (int i=1;i<=m;i++)while (t[i]>7)t[i]-=3,ans++;for (int i=0;i<=m;i++)for (int a=0;a<=7;a++)for (int b=0;b<=7;b++)dp[i][a][b]=-N*2;dp[0][0][0]=0;for (int i=0;i<m;i++)for (int a=0;a<=7;a++)for (int b=0;b<=7;b++){if (dp[i][a][b]<-N||a>t[i]||b>t[i+1])continue;int v=dp[i][a][b];for (int x=0;x<=2;x++)for (int y=0;y<=2;y++)if (a+x*3+y<=t[i]&&b+y<=t[i+1])ckmax(dp[i+1][b+y][y],v+x+y);}int k=0;for (int i=0;i<=t[m];i++)ckmax(k,dp[m][i][0]+(t[m]-i)/3);cout<<ans+k;return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/CF1110D.html

Codeforces 1110D. Jongmah 动态规划相关推荐

  1. Codeforces 1110D Jongmah dp

    文章目录 题意 题解 链接 题意 一种麻将的牌从1→m1 \to m1→m,给你一手牌,nnn张,求这手牌最多能组成面子的数量. 题解 标准dp,所以写一下博客. 可以发现同样三个数字组成的顺子不会超 ...

  2. By Elevator or Stairs? CodeForces - 1249E(动态规划)

    题意 n层楼,a[i] (0<i<n)表示从 i 楼到 i + 1 楼走楼梯的时间,b[i] (0<i<n)表示从 i 楼到 i + 1 楼乘电梯的时间,其中每一次乘电梯需要等 ...

  3. codeforces gym-101741 Elevator 动态规划、单调队列

    题目 这里写链接内容 题解 注意:题目给出是按照时间给出的顺序. 我们考虑第iii个人要上的楼高h[i]" role="presentation" style=" ...

  4. Basketball Exercise CodeForces - 1195C(动态规划dp)

    Finally, a basketball court has been opened in SIS, so Demid has decided to hold a basketball exerci ...

  5. codeforces D.MADMAX 动态规划、记忆化搜索

    题意 给出一个DAG,每条边上有权重(权重是小写字母的ASCII码),现在两位同学A和B分别位于某两点上(可以相同),其中A和B轮流走,但是每人所走的边权不能变小,走到不能走为止就输. A先走,询问最 ...

  6. Codeforces 480D Parcels 动态规划

    题意 有n件物品,每件物品有一个接受时间,发送时间,重量,承重和价值.每个物品可以不接受,但接受了就必须在发送时间将其发送出去,才能获得其价值.有一个平台,承重为m,每次可以将一件物品放到当前最顶部物 ...

  7. codeforces 687C (动态规划)The Values You Can Make

    The Values You Can Make Description(点击查看原题) Pari wants to buy an expensive chocolate from Arya. She ...

  8. android studio提示要重写的方法,Android Studio 重写方法时参数命名异常

    kuangbin_SegTree M (HDU 4553) put my gezi这句话不得不说我看了好几秒才反应过来什么意思(你咋不上天呢 目测了一下也是区间合并 但是是成段更新的区间合并 但是!我 ...

  9. 动态规划训练10 [Coloring Brackets CodeForces - 149D]

    西安交大 软件53 蔡少斐 整理 Coloring Brackets CodeForces - 149D 题目大意: 给定合法的括号序列,让你给括弧上色,并且上色时一定要满足3个要求: (1)每个括号 ...

  10. codeforces 792CDivide by Three(两种方法:模拟、动态规划

    传送门:https://codeforces.com/problemset/problem/792/C 题意:给你一个字符串,要求让你删除最少个数的元素,使得最终答案是没有前导0并且是3的倍数. 题解 ...

最新文章

  1. waitpid()函数
  2. Unable to parse the date: 2017-12-30 日期格式转化失败
  3. cv2.dnn.readNetFromDarknet()在python3上遇到的问题
  4. HUE Load Balancer 启动失败
  5. python做俄罗斯方块如何显示下一个随机方块_随机俄罗斯方块形状
  6. mybatis plus 格式话_作为阿里的面试官,我有话想说
  7. js map的get 和list比 那个快_js中let和var
  8. shell实战之日志脱敏
  9. 服务器串口协议,基于TCPIP协议串口通信服务器设计说明.docx
  10. 免费下载IEEE、SCI论文的网站
  11. Mac系统go版本升级
  12. 【C语言】操作符详解
  13. 以春雨为题写一篇500字的散文
  14. 运用“孤独九剑”解决项目实际问题(三)
  15. 最优化之凸集、凸函数、上确界、Jensen不等式、共轭函数、Fenchel不等式、拉格朗日乘子法、KKT条件
  16. 如何画 1PX 的线
  17. tomcat重启警告:Abandoned connection cleanup thread 服务器宕机解决方案
  18. 红米联通版刷机包 MIUIV6 扁平化 精简 稳定 流畅 省电 长用版
  19. Hexo Next主题添加百度统计
  20. 仙人掌之歌——开发(2)

热门文章

  1. 白话用consul作为注册中心搭建微服务
  2. 包管理conda操作,常用conda命令
  3. word图表自动编号
  4. pytorch与Keras对应模型Sequential()和add()
  5. Caffe各版本与源码全透析
  6. MatConvNet中关于vl_simplenn_display的一些分析
  7. 【机器学习实践】Kaggle 之 Face Verification Challenge练手
  8. python基于pip和conda配置国内安装源,提升下载安装性能
  9. python 表格模块 prettyTable 简单使用
  10. Visual Studio 2017 警告C4819解决方案