D. Jongmah(dp 三元组最大个数)

原题: http://codeforces.com/problemset/problem/1110/D

题意:

n个数,一组数可以是三个相同或连续的数,问最多组数。

解析:

三组连续的数相当于三组对应相同的数,所以可以不用考虑连续数大于两组的情况,用dp[i][j][k]记录到第i个点, j j [ i 1 , i , i + 1 ] [i-1,i,i+1] k k [ i , i + 1 , i + 2 ] [i,i+1,i+2] 的最优值。往下一个点更新时,枚举可行的连续组的数量,维护增加的组即可。

#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]);
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/88791933
今日推荐