zoukankan      html  css  js  c++  java
  • USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】

      nocows解题报告
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【题目】
      给你N个点,生成一棵K层的树,有s种情况。请输出s%9901的值。
      要求很简单,每个点只能有0个或2个孩子。
    【数据范围】
      3<=N<200
      1<K<100
    【输入格式】
      N K
    【输入样例】
      5 3
    【输出样例】
      2
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【分析】
      简单的DP。
      因为数据很小,所以直接递推就好了,也不需要任何优化。
      可以计算,总的时间大概是这样:
        for n = 3, 5, 7, .. , N
          for k = 1 ~ (n+1)/2
      这些情况,计算每种情况的时间是:
        n/2 * k*2 = n * k
      因此,结果就是这样的:
        Time = ∑n*k (n = 3,5,..,199; k = 1~(n+1)/2)
      大家可以自行计算一下(我有些忘了怎么算了-.-),但显然可以估算,结果明显是远小于1s的。
    ------------------------------------------------------------------------------------------------------------------------------------------------
    【总结】
      这题挺简单的,因为数据范围小,别让它的模型吓到就好。

    ------------------------------------------------------------------------------------------------------------------------------------------------

    【代码】

     1 /*
     2 ID: icedrea1
     3 PROB: nocows
     4 LANG: C++
     5 */
     6 
     7 #include <iostream>
     8 #include <fstream>
     9 using namespace std;
    10 
    11 const int maxn = 1+199;
    12 const int maxk = 1+99;
    13 
    14 int d[maxn][maxk];
    15 
    16 inline int add(int &s,int x) { return s=(s+x)%9901; }
    17 
    18 void calculate(int n,int k)
    19 {
    20     int s=0;
    21     for(int i=n-2;i>=1;i-=2)
    22     {
    23         int j=n-1-i; //cout<<"i,j = "<<i<<" "<<j<<endl;
    24         for(int t=1;t<=k-1;++t) add(s,d[i][k-1]*d[j][t]);
    25         for(int t=1;t<=k-1;++t) add(s,d[i][t]*d[j][k-1]);
    26         add(s,-d[i][k-1]*d[j][k-1]);
    27     }
    28     d[n][k]=add(s,9901); //cout<<"d["<<n<<"]["<<k<<"]="<<s<<endl;
    29 }
    30 
    31 int main()
    32 {
    33     ifstream in("nocows.in");
    34     ofstream out("nocows.out");
    35 
    36     int N,K;
    37     in>>N>>K;
    38 
    39     d[1][1]=1;
    40     for(int n=3;n<=N;n+=2)
    41         for(int k=1;k<=((n+1)>>1);++k) calculate(n,k);
    42 
    43     out<<d[N][K]<<endl;
    44 
    45     in.close();
    46     out.close();
    47     return 0;
    48 }
  • 相关阅读:
    Openwave V7 不支持中文的解决方法
    VBS的疑惑,它们不考虑效率吗?
    删除顽固 NTServic和webacc.exe病毒。
    我的电脑怎么多了一些乱七八糟的东西。
    阿怒再发,突然的发现,为了编码输入速度!
    庆祝开博,也算给自己加油!
    超级简单的工厂模式温度转换
    阿怒乱弹之VS05重构的提取方法操作不方便啊!
    随笔嘛!就是随便下笔~呵呵!
    Oracle数据库一样平常维护手册2
  • 原文地址:https://www.cnblogs.com/icedream61/p/4522106.html
Copyright © 2011-2022 走看看