zoukankan      html  css  js  c++  java
  • hunnu--11547--你的组合数学学得怎样?

    你的组合数学学得怎样? 
    Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB
    Total submit users: 151, Accepted users: 119
    Problem 11547 : No special judgement
    Problem description
      小明和小红总是喜欢在一起玩。一天。他们又在一起愉快的玩耍了一个下午。到了吃晚饭的时间,他们决定用抛硬币的方法来决定谁请吃晚餐。 
    规则非常easy,他们抛一枚均匀的硬币N次。假设出现连续两次或很多其它正面朝上的情况。那么就是小红请,否则就是小明请。 
    如今小明想知道。抛N次的全部情况下,会有多少次不出现连续两次正面或很多其它正面朝上的情况
    Input
      有多组測试数据,请处理到文件结束。
    每组測试数据仅包括一个数N(1 <= N <= 1000)。表示抛掷的次数。
    Output
      每组数据输出一行,格式为Case #k: Ans, k从1開始, Ans表示答案.
    因为答案可能会非常大,输出Ans % (10^9 + 7)就可以.
    Sample Input
    1
    2
    
    Sample Output
    Case #1: 2
    Case #2: 3
    Problem Source
      HUNNU Contest 

    解析:比較简单的DP。从左向右一个一个连续着放,dp[X][Y]表示到第X个硬币的时候Y状态的方案数,Y=0表示x左边那个不是正面的,Y=1表示x左边那个是正面

    假设左边不是正面,那么当前放正面的就把方案数加到Y=1里面,放反面的就加到Y=0

    假设是正面。那么当前放正面就不成立了,所以不用加。放反面就加到Y=0里面去

    递推公式:

    dp[i][0]= ( dp[i-1][0] + dp[i-1][1] )%mod;

    dp[i][1]= dp[i-1][0] %mod;

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #define mod 1000000007
    using namespace std;
    int main()
    {
        int n,i,j,k,l=1;
        int dp[1111][2];
        while(cin>>n)
        {
            memset(dp,0,sizeof(dp));
            dp[0][0]=1;
            for(i=1;i<=n;i++)//从1到n位置一个一个位置去考虑硬币的正反
            {
                dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mod;
                dp[i][1]=dp[i-1][0]%mod;
            }
            cout<<"Case #"<<l++<<": "<<(dp[n][0]+dp[n][1])%mod<<endl;
        }
        return 0;
    }
  • 相关阅读:
    ArcGIS Server GP服务发布与测试(基础版)
    【转】arcgis server site 快速恢复与重建
    ArGIS Server 服务的更新
    ArcMap中,如何查看当前工具是否在执行?如何将工具调到前台来执行?
    【转】ArcGIS 创建切片缓存方法工具总结
    ArcGIS Server 增加缓存路径
    修改ArcGIS Server Account / 站点管理员的 账号、密码
    ArcGIS Server 创建站点失败
    ArcGIS Server,4000端口被占用
    JS 中如何判断字符串类型的数字
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6759050.html
Copyright © 2011-2022 走看看