zoukankan      html  css  js  c++  java
  • noi.ac day3t2 染色

    传送门

    分析

    dp[i][j]为考虑前i个位置,[i-j+1,i]中的颜色互不相同,并且ai-j与这段区间中的某一个位置颜色相同

    我们枚举第i+1个位置和[i-j+1,i]中的哪一个颜色相同或者全部不同,进行转移

    dp[i][j]=dp[i-1][j-1]*(m-j+1)

    dp[i][j]+=dp[i-1][k](k>=j)

    发现第二个转移可以前缀和优化一下,显然dp[i+1][j]可以从dp[i][1~j]转移而来

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<queue>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    long long n,m,k,dp[2][6000],sum[2][6000];
    int main(){
        long long i,j,k;
        scanf("%lld%lld%lld",&n,&m,&k);
        long long now=0;
        dp[now][0]=1;
        for(i=1;i<=n;i++){
          now^=1;
          memset(dp[now],0,sizeof(dp[now]));
          memset(sum[now],0,sizeof(sum[now]));
          for(j=1;j<=min(i,m-1);j++){
              dp[now][j]=(dp[now][j]+dp[now^1][j-1]*(m-j+1))%k;
              dp[now][j]=(dp[now][j]+sum[now^1][j])%k;
          }
          for(j=n;j>0;j--)
            sum[now][j]=(sum[now][j+1]+dp[now][j])%k;
        }
        long long ans=0;
        for(i=1;i<m;i++)ans=(ans+dp[now][i])%k;
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    JAVA基础(十六)Super关键字
    JAVA基础(十五)this关键字
    JAVA基础(十四2.0)
    JAVA基础(十三)多态
    JAVA基础(十二)抽象类与接口
    git基本使用
    vuetify中treeview部分属性梳理
    vuetify初次使用心得
    react-常见面试题
    maven中profile的使用
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9821650.html
Copyright © 2011-2022 走看看