原题: http://codeforces.com/problemset/problem/1110/D
题意:
n个数,一组数可以是三个相同或连续的数,问最多组数。
解析:
三组连续的数相当于三组对应相同的数,所以可以不用考虑连续数大于两组的情况,用dp[i][j][k]记录到第i个点, 组 , 组 的最优值。往下一个点更新时,枚举可行的连续组的数量,维护增加的组即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+6;
int ct[maxn];
int dp[maxn][4][4];
int main(){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int tmp;scanf("%d",&tmp);
ct[tmp]++;
}
memset(dp,0xc0,sizeof(dp));
dp[0][0][0]=0;
for(int i=0;i<=m;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
int ma=min(min(min(ct[i+1]-j-k,ct[i+2]-k),ct[i+3]),2);
for(int nex=0;nex<=ma;nex++){
dp[i+1][k][nex]=max(dp[i+1][k][nex],
dp[i][j][k]+nex+(ct[i+1]-j-k-nex)/3);
}
}
}
}
printf("%d\n",dp[m+1][0][0]);
}