• Codeforces Global Round 1D(DP,思维)


    #include<bits/stdc++.h>
    using namespace std;
    int dp[1000007][7][7];
    int cnt[1000007];
    int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        int x=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            cnt[x]++;
        }
        for(int i=1;i<=m;i++)//只考虑前i种数字
            for(int j=0;j<=2;j++)//以i开头的三元组{i,i+1,i+2}
                for(int k=0;k<=2;k++)//以i-1开头的三元组{i-1,i,i+1}
                    for(int l=0;l<=2;l++)//以i-2开头的三元组{i-2,i-1,i}
                        if(cnt[i]-j-k-l>=0)//如果cnt[i]不能大于等于j+k+l的话该情况不成立,不用更新答案
                            dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+(cnt[i]-j-k-l)/3+j);//大于等于3的话将三元组转化为{i,i,i},在i-1之后添加i即可使k和l转化为j和k同时将答案更新+j(j可能不存在所以最后的答案也是j和k都为零的情况,j和k只是为了状态转移而产生)
        printf("%d",dp[m][0][0]);
        return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    noip2016组合数问题
    noip2017奶酪
    洛谷1091合唱队形
    洛谷P1075 质因数分解
    洛谷1004方格取数
    POJ2393奶酪工厂
    NOIP2012国王游戏(60分题解)
    洛谷1106删数问题
    洛谷1209修理牛棚
    二维树状数组区间修改+区间查询模版
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10412323.html
Copyright © 2020-2023  润新知