Codeforces Global Round 1 D. Jongmah(DP思维)

题意:

  一些数字,有两种方式组成一个三元组,[x,x,x],[x,x+1,x+2],每个数字只能用一次,求最多组成多少三元组。

分析:

  因为每三个[x,x+1,x+2]是可以拆成[x,x,x],[x+1,x+1,x+1],[x+2,x+2,x+2]的,所以可以认为对于以x开始的[x,x+1,x+2]最多有两个。

  于是可以dp[i][x][y]表示到第i个数字,存在x个[i-1,i,i+1],y个[i,i+1,i+2],最多组成多少个三元组(这些三元组的右端点在i以内,超出i三元组有x+y个,没有记录到里面)

  然后转移的时候枚举多少个[i+1,i+2,i+3]。

#include	<bits/stdc++.h>
using namespace std;
int n,m,a[1000010],x;
int f[1000010][3][3];
int main(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)scanf("%d",&x),a[x]++;
	memset(f,-1,sizeof(f));
	f[0][0][0]=0;
	for (int i=1;i<=m;i++)
	for (int x=0;x<3;x++)
	for (int y=0;y<3;y++)
	for (int z=0;z<3;z++)if (f[i-1][y][z]!=-1)
	if (z+y+x<=a[i])
	f[i][z][x]=max(f[i][z][x],f[i-1][y][z]+(a[i]-x-y-z)/3+y);
	
	printf("%d\n",f[m][0][0]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/u014713777/article/details/89449852