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 }

 

你可能感兴趣的:(USACO)