zoukankan      html  css  js  c++  java
  • Atcoder E

    题目链接:http://arc074.contest.atcoder.jp/tasks/arc074_c

    题意:一共有3种颜色,红色,绿色,蓝色。给出m个要求l,r,x表示在区间[l,r]内要有x种不同的颜色。

    问满足所有要求的染色方式一共有几种。

    题解:一般问一共有几种组合方式要么推数学公式,要么就是dp。

    不妨设dp[r][g][b]表示是k=max(r,g,b)前k个染色后r色结尾的位置为r,g色结尾的位置为g,b色结尾的位置为b。

    显然转移为dp[k+1][g][b]+=dp[r][g][b],dp[r][k+1][b]+=dp[r][g][b],dp[r][g][k+1]+=dp[r][g][b];

    然后就是如何判断这种情况是否可行。在询问的同时记录一下以r为结尾,上区间为l的,有x种颜色,可以用

    vector<pair<int,int> >vc[MAXN]来存,然后check的时候只要判断r,g,b是否大于等于l符合颜色种类数加一

    #include <iostream>
    #include <cstring>
    #include <vector>
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    const int MAXN = 305;
    vector<pair<int , int> >vc[MAXN];
    int dp[MAXN][MAXN][MAXN];
    bool check(int r , int g , int b) {
        int k = max(r , max(g , b));
        int len = vc[k].size();
        for(int i = 0 ; i < len ; i++) {
            int l = vc[k][i].first , x = vc[k][i].second;
            int cnt = 0;
            if(r >= l) cnt++;
            if(g >= l) cnt++;
            if(b >= l) cnt++;
            if(cnt != x) return false;
        }
        return true;
    }
    int main() {
        int n , m;
        cin >> n >> m;
        for(int i = 0 ; i < m ; i++) {
            int l , r , x;
            cin >> l >> r >> x;
            vc[r].push_back(make_pair(l , x));
        }
        memset(dp , 0 , sizeof(dp));
        dp[0][0][0] = 1;
        ll ans = 0;
        for(int r = 0 ; r <= n ; r++) {
            for(int g = 0 ; g <= n ; g++) {
                for(int b = 0 ; b <= n ; b++) {
                    if(!dp[r][g][b]) continue;
                    if(!check(r , g , b)) {
                        dp[r][g][b] = 0;
                        continue;
                    }
                    int k = max(r , max(g , b));
                    if(k == n) ans = (ans + (ll)dp[r][g][b]) % mod;
                    dp[k + 1][g][b] += dp[r][g][b] % mod;
                    dp[k + 1][g][b] %= mod;
                    dp[r][k + 1][b] += dp[r][g][b] % mod;
                    dp[r][k + 1][b] %= mod;
                    dp[r][g][k + 1] += dp[r][g][b] % mod;
                    dp[r][g][k + 1] %= mod;
                }
            }
        }
        cout << ans << endl;
        return 0;
    }
    
  • 相关阅读:
    商品详情的图片添加水印
    ElasticSearch 简单的crud查询
    java产生随机数的三种方式
    springboot+mybatis集成分页功能
    springboot集成swagger文档
    springboot项目根据不同的环境启动不同的配置,如开发环境dev,测试环境sit,生产环境application
    解释器模式
    中介者模式
    访问者模式
    x01.FileProcessor: 文件处理
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6891957.html
Copyright © 2011-2022 走看看