Codeforces 1110D. Jongmah 动态规划
原文链接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 动态规划相关推荐
- Codeforces 1110D Jongmah dp
文章目录 题意 题解 链接 题意 一种麻将的牌从1→m1 \to m1→m,给你一手牌,nnn张,求这手牌最多能组成面子的数量. 题解 标准dp,所以写一下博客. 可以发现同样三个数字组成的顺子不会超 ...
- By Elevator or Stairs? CodeForces - 1249E(动态规划)
题意 n层楼,a[i] (0<i<n)表示从 i 楼到 i + 1 楼走楼梯的时间,b[i] (0<i<n)表示从 i 楼到 i + 1 楼乘电梯的时间,其中每一次乘电梯需要等 ...
- codeforces gym-101741 Elevator 动态规划、单调队列
题目 这里写链接内容 题解 注意:题目给出是按照时间给出的顺序. 我们考虑第iii个人要上的楼高h[i]" role="presentation" style=" ...
- Basketball Exercise CodeForces - 1195C(动态规划dp)
Finally, a basketball court has been opened in SIS, so Demid has decided to hold a basketball exerci ...
- codeforces D.MADMAX 动态规划、记忆化搜索
题意 给出一个DAG,每条边上有权重(权重是小写字母的ASCII码),现在两位同学A和B分别位于某两点上(可以相同),其中A和B轮流走,但是每人所走的边权不能变小,走到不能走为止就输. A先走,询问最 ...
- Codeforces 480D Parcels 动态规划
题意 有n件物品,每件物品有一个接受时间,发送时间,重量,承重和价值.每个物品可以不接受,但接受了就必须在发送时间将其发送出去,才能获得其价值.有一个平台,承重为m,每次可以将一件物品放到当前最顶部物 ...
- codeforces 687C (动态规划)The Values You Can Make
The Values You Can Make Description(点击查看原题) Pari wants to buy an expensive chocolate from Arya. She ...
- android studio提示要重写的方法,Android Studio 重写方法时参数命名异常
kuangbin_SegTree M (HDU 4553) put my gezi这句话不得不说我看了好几秒才反应过来什么意思(你咋不上天呢 目测了一下也是区间合并 但是是成段更新的区间合并 但是!我 ...
- 动态规划训练10 [Coloring Brackets CodeForces - 149D]
西安交大 软件53 蔡少斐 整理 Coloring Brackets CodeForces - 149D 题目大意: 给定合法的括号序列,让你给括弧上色,并且上色时一定要满足3个要求: (1)每个括号 ...
- codeforces 792CDivide by Three(两种方法:模拟、动态规划
传送门:https://codeforces.com/problemset/problem/792/C 题意:给你一个字符串,要求让你删除最少个数的元素,使得最终答案是没有前导0并且是3的倍数. 题解 ...
最新文章
- waitpid()函数
- Unable to parse the date: 2017-12-30 日期格式转化失败
- cv2.dnn.readNetFromDarknet()在python3上遇到的问题
- HUE Load Balancer 启动失败
- python做俄罗斯方块如何显示下一个随机方块_随机俄罗斯方块形状
- mybatis plus 格式话_作为阿里的面试官,我有话想说
- js map的get 和list比 那个快_js中let和var
- shell实战之日志脱敏
- 服务器串口协议,基于TCPIP协议串口通信服务器设计说明.docx
- 免费下载IEEE、SCI论文的网站
- Mac系统go版本升级
- 【C语言】操作符详解
- 以春雨为题写一篇500字的散文
- 运用“孤独九剑”解决项目实际问题(三)
- 最优化之凸集、凸函数、上确界、Jensen不等式、共轭函数、Fenchel不等式、拉格朗日乘子法、KKT条件
- 如何画 1PX 的线
- tomcat重启警告:Abandoned connection cleanup thread 服务器宕机解决方案
- 红米联通版刷机包 MIUIV6 扁平化 精简 稳定 流畅 省电 长用版
- Hexo Next主题添加百度统计
- 仙人掌之歌——开发(2)
热门文章
- 白话用consul作为注册中心搭建微服务
- 包管理conda操作,常用conda命令
- word图表自动编号
- pytorch与Keras对应模型Sequential()和add()
- Caffe各版本与源码全透析
- MatConvNet中关于vl_simplenn_display的一些分析
- 【机器学习实践】Kaggle 之 Face Verification Challenge练手
- python基于pip和conda配置国内安装源,提升下载安装性能
- python 表格模块 prettyTable 简单使用
- Visual Studio 2017 警告C4819解决方案