SRM 690 WolfHockeyTeamEasy

11 篇文章 0 订阅
6 篇文章 0 订阅

有2*n只狼,编号为0到2*n-1。他们拍照时会排成两行,每行n只狼。一张照片好看,必须满足每一行的最大编号大于等于k。

每一张照片有一个特征序列,这个序列有n+2个元素,前n个元素分别是n列的列最大值,后两个元素分别是两行的行最大值。两张照片只有在特征序列不同时才被认为是不同的。

他们想知道可以拍多少张好看而又不同的照片。

const int M=2005,P=1e9+7;
class WolfHockeyTeamEasy {
public:
    int dp[M][M];
    //设有两行 第一行每列的值比第二行的小 
    //a为第一行的最大值 b为第二行的最大值  
    //因为一共有2*n个元素最大的元素为2*n-1==b于是n=(b+1)/2;
    //dp的转移
    //对于一个dp[a][b]如a=9 b=6的情况 
    //必有  9,8,7,?,? 位于第二行 
    //      - - - . .
    //<1>当6位于 - 时6的位置就确定了,于是第一行的需要考虑的元素就少了一个6 
    //<2>当6位于 . 时等价与第二行变成了9,8,7,6,? 贡献为dp[a][b-1]; 
    int dfs(int a,int b){
        if(b==1)return a<=1;
        if(!a||a>b)return 0;
        int &ans=dp[a][b];
        if(~ans)return ans;ans=0;
        ans=1ll*dfs(a-1,b)+dfs(a-1,b-2);
        return ans%=P;
    }
    int count(int n, int k) {
        memset(dp,-1,sizeof(dp));
        int ans=0;
        for(int i=k;i<=2*n-2;i++)
            ans=(1ll*ans+dfs(i,2*n-1))%P;
        for(int i=2;i<=n;i++)ans=(1ll*ans*i)%P;
        return 2ll*ans%P;
    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值