codeforces 1027E. Inverse Coloring

题解:

        先dp预处理出第一行,d[i][j]表示,处理到第1行的i个位置,最大连续区间为j。

然后对以下每行都是要么跟上一行相同,要么跟上一行不同,所以从上往下枚举最大连续相同的区间dp即可。dp[i][j]表示处理到第i行,每行最大连续区间是j。

#include"bits/stdc++.h"
#define debug(x) cout<<#x<<" = "< mod) a -= mod;
}

int main()
{

    int n,K;
    scanf("%d%d",&n,&K);
    --K;
    d[0][0] = 2;
    for(int i = 1; i <= n; i++)
        for(int j = 0; j <= i; j++){
            for(int k = 0; k <= i-j; k++)
                upd(d[i][max(j,k)], d[i-j][k]);
        }


    for(int i = 1; i <= n; i++){
        dp[0][i] += d[n][i];
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= i; j++){
            int m = min(K/j,n);
            for(int k = 1; k <= m; k++){
                upd(dp[i][k],dp[i-j][k]);
            }
        }
    }

    int ans = 0;
    for(int j = 1; j <= n; j++){
        upd(ans,dp[n][j]);
    }
    cout<

 

你可能感兴趣的:(DP)