码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛

时间:2015-02-06 13:11:13      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

组合计数

  排列组合求总方案数

  这个可以用一个一维的动态规划解决:

    f[i][0]表示第i头牛是牝牛的方案数

    f[i][1]表示第i头牛是牡牛的方案数

    则转移为:f[i][0]=f[i-1][0]+f[i-1][1];

            f[i][1]=f[i-K-1][0]+f[i-K-1][1];

 

常数优化:将取模运算改为if判断语句……可从20ms降为16ms

技术分享
 1 /**************************************************************
 2     Problem: 3398
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:16 ms
 7     Memory:1588 kb
 8 ****************************************************************/
 9  
10 //BZOJ 3398
11 #include<cstdio>
12 #define F(i,j,n) for(int i=j;i<=n;++i)
13 int getint(){
14     int v=0,sign=1; char ch=getchar();
15     while(ch<0||ch>9) {if (ch==-) sign=-1; ch=getchar();}
16     while(ch>=0&&ch<=9) {v=v*10+ch-0; ch=getchar();}
17     return v*=sign;
18 }
19 const int N=100086,P=5000011;
20 int f[N][2],n,K;
21 int main(){
22     n=getint(); K=getint();
23     f[1][0]=f[1][1]=1;
24     F(i,2,n){
25         if(i-K-1>0) f[i][1]=f[i-K-1][0]+f[i-K-1][1];
26         else f[i][1]=1;
27         f[i][0]=f[i-1][0]+f[i-1][1];
28         if(f[i][0]>=P) f[i][0]-=P;
29         if(f[i][1]>=P) f[i][1]-=P;
30     }
31     printf("%d\n",(f[n][0]+f[n][1])%P);
32     return 0;
33 }
View Code

 

【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4276832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!