zoukankan      html  css  js  c++  java
  • BZOJ 1037: [ZJOI2008]生日聚会Party 四维DP

    1037: [ZJOI2008]生日聚会Party

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1650  Solved: 971
    [Submit][Status][Discuss]

    Description

    今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party。 hidadz带着朋友们来到花园中,打算坐成一排玩游戏。为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k。很快,小朋友便找到了一种方案坐了下来开始游戏。hidadz的好朋友Susie发现,这样的就座方案其实是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的hidadz和她的朋友们开始思考这个问题…… 假设参加party的人中共有n个男孩与m个女孩,你是否能解答Susie和hidadz的疑问呢?由于这个数目可能很多,他们只想知道这个数目除以12345678的余数。

    Input

    仅包含一行共3个整数,分别为男孩数目n, 女孩数目m, 常数k。

    Output

    应包含一行,为题中要求的答案。

    Sample Input

    1 2 1

    Sample Output

    1

    HINT

    对于100%的数据, n , m ≤ 150,k ≤ 20。

    题解:dp[i][j][k1][k2]表示i男,j女时,男比女最多多k1个,女比男最多多k2个的方案数

    ///1085422276
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<map>
    #include<bitset>
    #include<set>
    #include<vector>
    using namespace std ;
    typedef long long ll;
    #define mem(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,127,sizeof(a))
    #define memfy(a) memset(a,-1,sizeof(a))
    #define TS printf("111111
    ")
    #define FOR(i,a,b) for( int i=a;i<=b;i++)
    #define FORJ(i,a,b) for(int i=a;i>=b;i--)
    #define READ(a,b) scanf("%d%d",&a,&b)
    #define g 9.8
    #define mod 12345678
    #define eps 1e-7
    #define maxn  1000000+10
    #define inf 10000000000;
    inline ll read()
    {
        ll x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        return x*f;
    }
    //****************************************
    int dp[200][200][30][30];
    int main()
    {
        mem(dp);
        int n=read(),m=read(),k=read();dp[0][0][0][0]=1;
        FOR(i,0,n)FOR(j,0,m)FOR(k1,0,k)FOR(k2,0,k){
           dp[i+1][j][k1+1][max(k2-1,0)]+=dp[i][j][k1][k2];dp[i+1][j][k1+1][max(k2-1,0)]%=mod;
           dp[i][j+1][max(k1-1,0)][k2+1]+=dp[i][j][k1][k2];dp[i][j+1][max(k1-1,0)][k2+1]%=mod;
        }ll ans=0;
        FOR(i,0,k)FOR(j,0,k){ans+=dp[n][m][i][j];ans%=mod;}
        cout<<ans<<endl;
        return 0;
    }
    代码
  • 相关阅读:
    Swift_Set详解
    Swift_数组详解
    Swift_字符串详解(String)
    选择排序_C语言_数组
    插入排序_C语言_数组
    快速排序_C语言_数组
    冒泡排序_C语言_数组
    七牛直播收获分享
    iOS 实用博客整理(连载版)
    iOS Swift-元组tuples(The Swift Programming Language)
  • 原文地址:https://www.cnblogs.com/zxhl/p/4803960.html
Copyright © 2011-2022 走看看