Link:

BZOJ 1037 传送门

Solution:

由于对任意一段都有要求,于是我们对于所有前缀考虑其后缀不超过$k $即可:

设$dp[i][j][x][y]$为前$i$个人中有$j$个男孩,且后缀中男女最大相差$x$,女男最大相差$y$时的方案数

每次向添加女孩/添加男孩转移。

注意:如果差值为负数时置为$0$,因为无论差了多少,在下一次添加相同性别时最大相差都会变为$1$

Code:

#include <bits/stdc++.h>

using namespace std;
const int MOD=;
const int MAXN=;
int dp[*MAXN][MAXN][][],n,m,k,res=; int main()
{
scanf("%d%d%d",&n,&m,&k);dp[][][][]=; //初始值
for(int i=;i<n+m;i++) for(int j=;j<=n;j++)
for(int x=;x<=k;x++) for(int y=;y<=k;y++)
if(dp[i][j][x][y])
{
if(j+<=n && x+<=k) (dp[i+][j+][x+][max(,y-)]+=dp[i][j][x][y])%=MOD;
if(y+<=k && i+-j<=m) (dp[i+][j][max(,x-)][y+]+=dp[i][j][x][y])%=MOD;
}
for(int i=;i<=n;i++) for(int j=;j<=k;j++) for(int x=;x<=k;x++)
(res+=dp[n+m][i][j][x])%=MOD;
printf("%d",res);
return ;
}

Review:

(1)如果转移为向后添加数时,一般用已知数向后转移未知数更方便,而非未知数反推已知数

(2)如果对“任意一段”有要求时,转移时保证每一个前缀的最差后缀都合法即可

最新文章

  1. 用CAShapeLayer实现一个简单的饼状图(PieView)
  2. ps中的位图,矢量图,颜色模式
  3. 用直接路径(direct-path)insert提升性能的两种方法
  4. Android基于mAppWidget实现手绘地图(二)--概要
  5. 非常实用的jquery版表单验证
  6. 解决Linux CentOS中cp -f 复制强制覆盖的命令无效的方法
  7. PHP二次开发discuz3.2最新体验
  8. HLA高级汇编语言基础
  9. ajax开发框架和XMLhttpRequest、responseText、responseXml和JSON的应用
  10. 数据迁移sql
  11. (89c51)16x16点阵屏幕的实现
  12. Kettle(Pentaho)实现web方式远程执行job或transformation
  13. sql统计总和和各状态数
  14. wordcount源代码详解
  15. C# — Socket通信实现
  16. PAT L2-009 抢红包
  17. 输入三个double型的数据,放入到a,b,c三个变量中去,使用条件结构与交换逻辑将这三个变量中的值从小到大排列。
  18. Scrum Meeting 汇总
  19. Linux traceroute命令详解
  20. [USACO13NOV] Pogo-Cow

热门文章

  1. [类和对象]4 C++ static &amp; friend
  2. 洛谷P1071潜伏者(提高组)
  3. 编译caffe遇到的问题
  4. SPOJ 362 Ignore the Garbage 转7进制+简单大数除法
  5. 关于tap设备
  6. ubuntu系统更换源
  7. TensorFlow 模型文件
  8. Hash表模板
  9. Educational Codeforces Round 22 E. Army Creation
  10. SpringBoot Redis序列化配置