zoukankan      html  css  js  c++  java
  • 涂色游戏

    Description

    在一个1*N的格子上,每个格子可以选择涂成红色或蓝色。 求至少 M 个连续为红色的方案数。

    Input

    多组输入,每组输入包含两个整数M和N  (0<N,M<100000)

    Output

    输出存在至少连续M个为红色的方案数,对1000000007取模

    Sample Input

    3 4

    Sample Output

    3
    这道题有点意思,基本就是核电站问题的翻版
    基本思路就是,还是和核电站一样,要考虑前几个格子避免连续n个红格子的思路
    嗯,忘了刚才那句吧,我再说一遍
    f[i]请参见核电站对f数组的定义
    而q[i]就是这次前i个 (里面至少 M 个连续为红色)的方案数
     
    q[i]=q[i-1]*2(这里就是指在第i个涂红还是不涂红)+f[i-m-1](考虑到i-m+1到i全涂红的方案数)
    #include<iostream>
    #include <stdio.h>  
    #include <math.h>
    #include<stdio.h>
    #include<string.h>  
    using namespace std;
     const int MOD=1e9+7;
    int main()
    {
         long long  f[100000];int i,n,m;
         long long  g[100000];
        int number;
        while(scanf("%d%d",&m,&n)!=EOF)
        {	 memset(f,0,sizeof(f));
    		 memset(g, 0,sizeof(g));
    		f[0]=1;
    	    for(i=1;i<=n;i++)
    	    {
    	    	 if(i<m)
    			 {
    			 	f[i]=2*f[i-1];
    			 	f[i]%=MOD;
    			 	g[i]=0;
    			 }
       		 	 if(i==m)
    			 {
    				 	f[i]=2*f[i-1]-1;
    				 	f[i]%=MOD;
    				 	g[i]=1; 
    			 }
        	if(i>m)
    		 {
    			 f[i]=2*f[i-1]-f[i-m-1]+MOD;
    		 	f[i]=f[i]%MOD;
    			g[i]=2*g[i-1]+f[i-m-1]+MOD;
    			g[i]=g[i]%MOD;
    			
    		 
    		 }
    		 
    	} 
    	 for(i=1;i<=n;i++)
        {
        	printf(" g[%d]=%d  f[%d]=%d \n",i,g[i],i,f[i]);
    	} 
       cout<<g[n]%1000000007<<endl;
    //	cout<<" "<<m+n<<endl;
    	}
    
        
        return 0;
        }
    

      

  • 相关阅读:
    引用 struts2标签详解
    Java 中日期的计算
    在一个FORM中实现多个ACTION动作
    java.lang.OutOfMemoryError: PermGen space最好的解决方法
    Java实现和栈的应用举例
    Java的自动装箱和拆箱
    oracle11g更改字符集AL32UTF8为ZHS16GBK
    设计的臭味
    OOD设计五个原则
    推荐JQuery学习简介
  • 原文地址:https://www.cnblogs.com/zhko11993/p/3806907.html
Copyright © 2011-2022 走看看