zoukankan      html  css  js  c++  java
  • 2019牛客国庆集训派对day2 Circular Coloring(动态规划)

    题目链接:https://ac.nowcoder.com/acm/contest/1107/D

    题意:有一个由n+m个球构成的环,Bobo希望将n个球染成黑色,将m个球染成白色。Bobo用相同的颜色对相邻的球进行分组,他将着色的权重确定为组的长度的乘积。他想知道可能的颜色权重之和。答案对1e9+7取模。

    解题思路:个人觉得本题难度较大。首先我们会发现,涂成黑白两色的区域的数目相同。那么我们可以定义dp【i】【j】为将j个球分成i块所有可能的乘积的和。那么状态转移方程为:

    dp【i】【j】=(j-i+1)*dp【i-1】【i-1】+(j-i)*dp【i-1】【i】+。。。+2*dp【i-1】【j-2】+dp【i-1】【j-1】。但是注意dp的时候会将不同顺序的相同结果记录下来,所以最后算的时候我们要除以i。由于它是一个环,所以最终的答案要乘上(n+m)。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=5e3+5;
    int dp[maxn][maxn];
    int inv[maxn];
    const long long mod=1e9+7;
    int main(){
        inv[1]=1;
        for(int i=2;i<=5000;i++){
            inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
        }
        dp[0][0]=1;
        for(int i=1;i<=5000;i++){
            dp[i][i]=dp[i-1][i-1];
            int tem=dp[i-1][i-1];
            for(int j=i+1;j<=5000;j++){
            	tem=(tem+dp[i-1][j-1])%mod;
                dp[i][j]=(tem+dp[i][j-1])%mod;
            }
        }
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF){
            int tem=min(n,m);
            long long ans=0;
            for(int i=1;i<=tem;i++){
                ans=(ans+1ll*dp[i][n]*dp[i][m]%mod*inv[i])%mod;
            }
            printf("%lld
    ",1ll*ans*(n+m)%mod);
        }
        return 0;
    }
    

      

      

    2019牛客国庆集训派对day2

  • 相关阅读:
    Jmeter四种参数化方式
    微信公众号开发--服务器接入
    IIS调试程序
    vs连接GitHub
    vs2013 卸载
    Edge,IE浏览器 兼容模式设置
    XML非法字符的处理
    SQL Server Union联合查询
    SQL Server NULL的正确用法
    SQL Server Like 与 通配符
  • 原文地址:https://www.cnblogs.com/Zhi-71/p/11621118.html
Copyright © 2011-2022 走看看