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的。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
这题挺简单的,因为数据范围小,别让它的模型吓到就好。
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/*
ID: icedrea1
PROB: nocows
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; const int maxn = +;
const int maxk = +; int d[maxn][maxk]; inline int add(int &s,int x) { return s=(s+x)%; } void calculate(int n,int k)
{
int s=;
for(int i=n-;i>=;i-=)
{
int j=n--i; //cout<<"i,j = "<<i<<" "<<j<<endl;
for(int t=;t<=k-;++t) add(s,d[i][k-]*d[j][t]);
for(int t=;t<=k-;++t) add(s,d[i][t]*d[j][k-]);
add(s,-d[i][k-]*d[j][k-]);
}
d[n][k]=add(s,); //cout<<"d["<<n<<"]["<<k<<"]="<<s<<endl;
} int main()
{
ifstream in("nocows.in");
ofstream out("nocows.out"); int N,K;
in>>N>>K; d[][]=;
for(int n=;n<=N;n+=)
for(int k=;k<=((n+)>>);++k) calculate(n,k); out<<d[N][K]<<endl; in.close();
out.close();
return ;
}