标签:
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 Section2.3 Cow Pedigrees 解题报告 【icedream61】
标签:
原文地址:http://www.cnblogs.com/icedream61/p/4522106.html