• 【OpenJudge9275】【Usaco2009 Feb】【递推】Bullcow


    Bullcow

    总时间限制: 12000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB

    【描述】

    一年一度的展会要来临了,农民约翰想要把N(1 <= N <= 100,000)只奶牛和公牛安排在单独的一行中。 约翰发现最近公牛们非常好斗;假如两只公牛在这一行中靠的太近,他们就会吵架,以至于斗殴,破坏这和谐的环境。约翰非常的足智多谋,他计算出任何两只公牛之间至少要有K (0 <= K < N)只奶牛,这样才能避免斗殴。 约翰希望你帮助他计算一下有多少种安排方法,可避免任何斗殴的的发生。约翰认为每头公牛都是一样的,每头奶牛都是一样的。因而,只要在一些相同的位置上有不同种类的牛,那这就算两种不同的方法。 

    【输入】

    第一行:两个用空格隔开的数:N和K

    【输出】

    第一行:一个单独的数,即约翰可以安排的方法数。考虑到这个数可能很大,你只要输出mod 5,000,011之后的结果就可以了。

    【样例输入】

    4 2
    输入注释
    约翰想要一排4头牛,但是任何两只公牛之间至少有两头奶牛

    【样例输出】

    6

    【提示】

    下面的就是约翰思考出可行的6种方案(C代表奶牛,B代表公牛)

    CCCC

    BCCC

    CBCC

    CCBC

    CCCB

    BCCB

    【Solution】

      dp[i][0]表示位置i不放公牛,dp[i][1]表示位置i放公牛。

      当位置i不放公牛,位置i-1对其不产生影响,所以dp[i][0]可以从dp[i-1][0]和dp[i-1][1]转移过来

      当位置i放公牛,位置i-M一定不能放公牛,所以dp[i][1]可以从dp[i-M][0]转移过来

      还有一个难点在预处理上。在1~M中如果位置i放一头公牛那么就只能放那一头公牛,所以dp[i][1]=1。如果位置i不放牛,那么放公牛的方案就有i-1种,不放公牛的方案有1种,所以dp[i][0]=i-1+1=i

      总结一下,预处理时dp[i][1]=1,dp[i][0]=i;DP时dp[i][0]=dp[i-1][0]+dp[i-1][1],dp[i][1]=dp[i-M][0]

      AC代码:

     1 #include <cstdio>
     2 const int MOD=5000011;
     3 int N,M;
     4 int dp[100010][2];
     5 int main(){
     6     scanf("%d%d",&N,&M); dp[0][0]=1;dp[0][1]=0;
     7     for(int i=1;i<=M;++i) dp[i][1]=1,dp[i][0]=i;
     8     for(int i=M+1;i<=N;++i){
     9         dp[i][0]=dp[i-1][1]%MOD+dp[i-1][0]%MOD; 
    10         dp[i][1]=dp[i-M][0]%MOD;
    11     }
    12     printf("%d",(dp[N][1]+dp[N][0])%MOD);
    13     return 0;
    14 }
  • 相关阅读:
    vue获取客户端ip地址
    Webpack 4 : ERROR in Entry module not found: Error: Can't resolve './src'
    PageHelper使用以及PageInfo中分页对象的转化
    PyCharm创建Django项目并连接mysql数据库
    Java常用类介绍
    Mybatis中的Mapper.xml映射文件sql查询接收多个参数
    学会聆听……
    SpringSecurity学习
    自定义线程池配置类
    雅虎的工程师团队给出的35个web开发最佳实践
  • 原文地址:https://www.cnblogs.com/reddest/p/6003544.html
Copyright © 2020-2023  润新知