#线性dp#CF1110D Jongmah
分析
考虑三个 \((i,i+1,i+2)\) 可以用 \((i,i,i)\) 和 \((i+1,i+1,i+1)\) 和 \((i+2,i+2,i+2)\) 代替,
所以这样的三元组本质上最多出现两次,设 \(dp[n][i][j]\) 表示
前 \(n\) 个其中 \(i\) 个作为 \((n-1,n,n+1)\),\(j\) 个作为 \((n,n+1,n+2)\) 的最多三元组个数,
那么 \(dp[n][i][j]=\sum_{k=0}^2 dp[n-1][j][k]+i+\lfloor\frac{a_n-i-j-k}{3}\rfloor\)
最后答案为 \(dp[n][0][0]\)
代码
#include <cstdio>
#include <cstring>
#include <cctype>
#define rr register
using namespace std;
const int N=1000011;
int n,m,a[N],dp[3][3],f[3][3];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed max(int a,int b){return a>b?a:b;}
signed main(){
n=iut(); m=iut();
for (rr int i=1;i<=n;++i) ++a[iut()];
for (rr int P=1;P<=m;++P){
memset(f,0,sizeof(f));
for (rr int j=0;j<3;++j)
for (rr int i=0;i<3;++i)
for (rr int k=0;k<3;++k)
if (a[P]>=k+j+i)
f[j][i]=max(f[j][i],dp[k][j]+i+(a[P]-k-j-i)/3);
memcpy(dp,f,sizeof(dp));
}
return !printf("%d",dp[0][0]);
}
#线性dp#CF1110D Jongmah的更多相关文章
- [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题
题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...
- CF1110D Jongmah
题目地址:CF1110D Jongmah 约定:称形如 \([a-1,a,a+1]\) 这样的三元组为关于 \(a\) 的顺子,形如 \([a,a,a]\) 这样的三元组为关于 \(a\) 的对子. ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
随机推荐
- FFmpeg开发笔记(十一):ffmpeg在移植到海思HI35xx平台之将ffmpeg库引入到sample的demo中
前言 上一篇交叉编译了ffmpeg的海思版本,使用交叉编译的qt的ffmpeg播放器在海思上播放,本片是将ffmpeg的环境添加进海思的sample环境中. 在海思sample中引入ffmpe ...
- linux下安装nginx(编译安装)及反向代理及负载均衡
首先卸载掉之前用yum命令下载的nginx yum remove nginx 安装nginx需要的依赖库 yum install -y gcc patch libffi-devel python-de ...
- C++ STL 容器 list类型
C++ STL 容器 list类型 list对于异常支持很好,要么成功,要么不会发生什么事情 以下是 std::list 在异常处理方面表现良好的几个原因: 动态内存管理:std::list 使用动态 ...
- matlab修改读取mat文件后的变量名
代码如下: %% str1=load('CH1.mat'); val_names = fieldnames(str1); % 获取结构体后那个未知的变量名 data1 = getfield(str1, ...
- liunx 前台打包的两个报错 Invalid value used in weak set - MIS国产化服务器不支持打包
错误1 Invalid value used in weak set Webpack4使用 mini-css-extract-plugin 最新版 压缩css 报 "Invalid valu ...
- git cherry-pick 摘樱桃 vscode
git cherry-pick -n b2e9bf7530ce42910a5be99c358fa8c7ab6af507 -n 就是临时到暂存里面 SHA 可以为多个 逗号拼接
- labeImg 遇到闪退问题,TypeError: setValue(self, a0: int): argument 1 has unexpected type 'float'
将python 环境安装为python3.9,然后重新安装labelImg
- 自我总结的git的使用
git是什么 git是一个分布式版本控制工具,github是代码托管平台. git有什么用 保存文件的所有修改记录 使用版本号进行区分 随时可浏览历史版本记录 可还原到历史指定版本 对比不同版本的文件 ...
- C++容器、类型转换、异常与文件流操作
C++容器.类型转换.异常与文件流操作 目录 C++容器.类型转换.异常与文件流操作 容器 序列式容器/顺序容器 向量(vector) 列表 (list) 双端队列(deque) 栈(stack) 队 ...
- HMAC算法:数据传输的保护神
HMAC算法起源: HMAC(Hash-based Message Authentication Code)算法是由Mihir Bellare.Ran Canetti和Hugo Krawczyk于19 ...