zoukankan      html  css  js  c++  java
  • bzoj 1037 [ZJOI2008]生日聚会Party(DP)

    【题目链接】

        http://www.lydsy.com/JudgeOnline/problem.php?id=1037

    【题意】

        一排n男m女,求满足任意连续段男女人数之差不超过k的数目。

    【思路】

        DP

        设f[a][b][c][d]表示a男b女,男生女生人数最大差为c,女生男生人数最大差为d的方案数,则有转移方程:

        f[a+1][b][c+1][max(d-1,0)]<-f[a][b][c][d]

        f[a][b+1][max(c-1,0)][d+1]<-f[a][b][c][d]

      太神辣 -<

    【代码】

     1 #include<cstdio>
     2 #include<iostream>
     3 #define FOR(a,b,c) for(int a=b;a<=c;a++)
     4 using namespace std;
     5 
     6 const int N = 200;
     7 const int MOD = 12345678;
     8 
     9 int f[N][N][25][25];
    10 int n,m,K;
    11 
    12 int main()
    13 {
    14     scanf("%d%d%d",&n,&m,&K);
    15     f[0][0][0][0]=1;
    16     FOR(a,0,n) FOR(b,0,m) 
    17         FOR(c,0,K) FOR(d,0,K)
    18         if(f[a][b][c][d]) {
    19             if(a<n&&(c<K)) {
    20                 f[a+1][b][c+1][max(d-1,0)]=(f[a+1][b][c+1][max(d-1,0)]+f[a][b][c][d])%MOD;
    21             } 
    22             if(b<m&&d<K) {
    23                 f[a][b+1][max(c-1,0)][d+1]=(f[a][b+1][max(c-1,0)][d+1]+f[a][b][c][d])%MOD;
    24             }
    25         }
    26     int ans=0;
    27     FOR(c,0,K) FOR(d,0,K)
    28         ans=(ans+f[n][m][c][d])%MOD;
    29     printf("%d
    ",ans);
    30 }
  • 相关阅读:
    异常定义-Mybatis中的源码参考
    前置机介绍说明
    MyBatis源码解析(一)
    Mybatis思
    石杉的架构笔记(一)
    nacos启动
    JVM图解
    二叉搜索树的第K大节点
    第一个只出现一次的字符
    表示数值的字符串
  • 原文地址:https://www.cnblogs.com/lidaxin/p/5264266.html
Copyright © 2011-2022 走看看