BZOJ 1037 生日聚会(神DP)

这题的DP很难想,定义dp[i][j][a][b]表示用了i个男生,j个女生,任一连续的后缀区间内,男生比女生最多多a人,女生比男生最多多b人。

转移就是显然了。

# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-9
# define MOD 12345678
# define INF 1000000000
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<1,l,mid
# define rch p<<1|1,mid+1,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {
    int res=0, flag=0;
    char ch;
    if((ch=getchar())==‘-‘) flag=1;
    else if(ch>=‘0‘&&ch<=‘9‘) res=ch-‘0‘;
    while((ch=getchar())>=‘0‘&&ch<=‘9‘)  res=res*10+(ch-‘0‘);
    return flag?-res:res;
}
void Out(int a) {
    if(a<0) {putchar(‘-‘); a=-a;}
    if(a>=10) Out(a/10);
    putchar(a%10+‘0‘);
}
const int N=10005;
//Code begin...

int dp[155][155][25][25];

int main ()
{
    int n, m, k;
    scanf("%d%d%d",&n,&m,&k);
    dp[0][0][0][0]=1;
    FOR(i,0,n) FOR(j,0,m) FOR(l1,0,k) FOR(l2,0,k) {
        dp[i+1][j][l1+1][max(l2-1,0)]=(dp[i+1][j][l1+1][max(l2-1,0)]+dp[i][j][l1][l2])%MOD;
        dp[i][j+1][max(l1-1,0)][l2+1]=(dp[i][j+1][max(l1-1,0)][l2+1]+dp[i][j][l1][l2])%MOD;
    }
    int ans=0;
    FOR(i,0,k) FOR(j,0,k) ans=(ans+dp[n][m][i][j])%MOD;
    printf("%d\n",ans);
    return 0;
}

时间: 2024-12-21 01:10:01

BZOJ 1037 生日聚会(神DP)的相关文章

BZOJ 1037 生日聚会Party(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1037 题意:给定n个0m个1.有多少种排列方式使得任意一段中01的个数差小于等于K? 思路:f[i][j][k][t]表示i个0.j个1.0比1最多多k个.1比0最多多t的方案数. int n,m,K,f[N][N][21][21]; void up(int &x,int y) { x+=y; if(x>=mod) x-=mod; } int main() { RD(n,m,K);

BZOJ 1037 生日聚会

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

BZOJ 1037: [ZJOI2008]生日聚会Party( dp )

dp(i, j, a, b)表示选了i个男生, j个女生, 后缀中男生比女生多a(最多), 女生比男生多b(最多). dp(i+1, j, a+1, max(0, b-1)) += dp(i, j, a, b) dp(i, j+1, max(0, a-1), b+1) += dp(i, j, a, b) 时间复杂度O(NMK^2) -----------------------------------------------------------------------------------

bzoj [ZJOI2008]生日聚会Party

思路:dp, 用dp[ i ][ j ][ u ][ v ] 表示, 有n个人,其中有j个是男生,后缀区间中男生人数减去女生人数的最大值为u, 女生人数减去男生人数 的最大值为v, 然后就能写出状态转移方程. 1 #include<bits/stdc++.h> 2 #define LL long long 3 #define fi first 4 #define se second 5 #define mk make_pair 6 #define pii pair<int,int>

[luogu2592 ZJOI2008] 生日聚会 (计数dp)

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

BZOJ 1037: [ZJOI2008]生日聚会Party 四维DP

1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1650  Solved: 971[Submit][Status][Discuss] Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.很快,小朋友便找

[BZOJ 1037][ZJOI2008]生日聚会Party

1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2560  Solved: 1538[Submit][Status][Discuss] Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k.很快,小朋友便

【BZOJ】【1037】【ZJOI2008】生日聚会party

DP orz iwtwiioi 这种题居然是DP……原来统计方案数是可以用动态规划来做的啊= =用一些变量来维护一些信息,保证方案可行性/合法性 人太弱实在是有些忧伤…… 1 /************************************************************** 2 Problem: 1037 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:460 ms 7 Memory:42660 kb 8

bzoj千题计划125:bzoj1037: [ZJOI2008]生日聚会Party

http://www.lydsy.com/JudgeOnline/problem.php?id=1037 一个区间是否满足 任意连续的一段,男孩与女孩的数目之差不超过k, 取决于男孩与女孩数目之差的最大值是否满足条件 而且若在一个位置 上坐一个男孩, 所有包含这个位置的区间 男孩与女孩数目之差+1,与女孩与男孩数目之差-1 所以我们只需要知道 最大的数目 之差即可 dp[i][j][k][l] 表示前i个位置,坐了j个男孩,男孩与女孩数目之差=k,女孩与男孩数目之差=l 的方案数 k<0 怎么办