CF1110D Jongmah

传送门

我觉得这个题特别水啊,就是自己不会写而已
只要想到每三个连续的可以转化,这题就差不多了
所以每种连续的最多出现2次,直接dp就行了
代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void read(int &x) {
	char ch; bool ok;
	for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
	for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int maxn=1e6+10;
int n,m,a[maxn],b[maxn],f[maxn][3][3],ans;
int main()
{
	read(n),read(m);
	for(rg int i=1;i<=n;i++)read(a[i]),b[a[i]]++;
	for(rg int i=1;i<=m;i++)
		for(rg int x=0;x<=2;x++)
			for(rg int y=0;y<=2;y++)
				for(rg int z=0;z<=2;z++)
					if(b[i]>=x+y+z)f[i][x][y]=max(f[i][x][y],f[i-1][z][x]+(b[i]-x-y-z)/3+y);
	printf("%d
",f[m][0][0]);
}
原文地址:https://www.cnblogs.com/lcxer/p/10364237.html