【luogu1472】 奶牛家谱 Cow Pedigrees [动态规划]

一时暴搜一时爽 一直暴搜一直爽  cxl居然和我写的同款dfs,天呢

菜鸡开始对这题并没有什么想法 状态方程死活想不出来 还是暴搜好

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define rg register
 5 const int N=200,K=100,P=9901;
 6 int n,k,f[K+5][N+5],ans=0;
 7 template <class t>void rd(t &x)
 8 {
 9     x=0;int w=0;char ch=0;
10     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
11     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
12     x=w?-x:x;
13 }
14 
15 void dfs(int deep,int l,int r)
16 {
17     if(deep==k&&(l+r+1)==n) {++ans;ans%=P;return;}
18     if((l+r+1>=(1<<deep))||deep>k) return;
19     dfs(deep+1,l,r+2);dfs(deep+1,l+2,r);
20     dfs(deep,l+2,r);dfs(deep,l,r+2);
21 }
22 
23 int main()
24 {
25     freopen("nocows.in","r",stdin);
26     freopen("nocows.out","w",stdout);
27     rd(n),rd(k);
28     if(n==(1<<k)-1) {printf("1");exit(0);}
29     dfs(2,1,1);
30     printf("%d",ans);
31     return 0;
32 }
16昏 搜索

然后考完一讲 dp[i][j]表示j个点不超过i层的方案数 不超过?! 怎么可以这么机智啊啊啊啊 我怎么就想不到

然后最后答案用dp[k][n]-dp[k-1][n]  因为中途%了有可能减出来为负 最后要+P然后% 别问我为什么知道

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define rg register
 5 const int N=200,K=100,P=9901;
 6 int n,k,f[K+5][N+5],ans=0;
 7 template <class t>void rd(t &x)
 8 {
 9     x=0;int w=0;char ch=0;
10     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
11     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
12     x=w?-x:x;
13 }
14 
15 int main()
16 {
17     //freopen("nocows.in","r",stdin);
18     //freopen("nocows.out","w",stdout);
19     rd(n),rd(k);
20     for(rg int i=1;i<=k;++i) f[i][1]=1;
21     for(rg int dep=1;dep<=k;++dep)
22     for(rg int i=3;i<=n;i+=2)
23     for(rg int j=1;j<i;j+=2)
24     f[dep][i]=(f[dep][i]+f[dep-1][j]*f[dep-1][i-j-1])%P;
25     printf("%d",(f[k][n]-f[k-1][n]+P)%P);
26     return 0;
27 }

猜你喜欢

转载自www.cnblogs.com/lxyyyy/p/10809013.html