usaco2.3.2奶牛家谱

76 篇文章 0 订阅

本来是这样写的,但这样有些费时,重复计算了很多算过了的,所以超时,同时,因为高度有100,那么按我的方法,贮存最大节点数的变量会出现溢出,这也证明,这一题不用dp不行啊。。。。。。

#include<iostream>

#include<cstdio>
#include<cstdlib>
#include <cmath>
using namespace std;
int n,h;
int aaa(int h1,int n1,int key);
int main()
{
  //freopen("nocows.in","r",stdin);
  //freopen("nocows.out","w",stdout);
  cin>>n>>h;
  int num=aaa(h,n,1);
  cout<<num%9901<<endl;
 return 0;
}
int aaa(int h1,int n1,int key)
{
    if(h1<1)return 0;
    if(pow(2,h1)-1<n1)return 0;
     else if(pow(2,h1)-1==n1&&key==1)return 1;
     else if(key==2&&pow(2,h1-1)-1==n1)return 1;
    if(key==1){
            if(n1<2*h1-1)return 0;
    int k1=(int)pow(2,h1-1)-1,sum=0;
    for(int i=2*h1-3;i<=k1&&i<=n1;i+=2){
        if(n1-1-i<=k1&&n1-1-i>0){


            int a=aaa(h1-1,i,1);
            int b=aaa(h1-1,n1-i-1,2);
            int c=aaa(h1-1,n1-i-1,1);
            sum+=(a*b*2+a*c);
        }
        }
    return sum;
    }
    else {
        int sum=0;
        for(int i=1;i<h1;i++){
            sum+=aaa(i,n1,1);
        }


        return sum;
    }

}

对的代码:

/*
ID:thy47021
LANG:C++
TASK:nocows
*/


#include <cstdio>
#include <iostream>
using namespace std;
int n,k,dp[200][200];
int main()
{
    freopen("nocows.in", "r", stdin);
freopen("nocows.out", "w", stdout);
     cin>>n>>k;
    dp[1][1]=1;
    for(int i=3;i<=n;i+=2)
      for(int j=1;j<=n-2;j+=2)
        for(int h1=1;h1<=(j+1)/2;h1++)
        for(int h2=1;h2<=(i-j)/2;h2++)
          {dp[i][max(h1,h2)+1]+=dp[j][h1]*dp[i-j-1][h2];
          dp[i][max(h1,h2)+1]%=9901;
          }
          cout<<dp[n][k]<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值