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 }

 

posted on 2015-05-22 13:30  IceDream61  阅读(218)  评论(0编辑  收藏  举报

导航