Description

黑白棋(game
【问题描述】
小A和小B又想到了一个新的游戏。
这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色。
最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同。
E
小A可以移动白色棋子,小B可以移动黑色的棋子,他们每次操作可以移动1到d个棋子。
每当移动某一个棋子时,这个棋子不能跨越两边的棋子,当然也不可以出界。当谁不可以操作时,谁就失败了。
小A和小B轮流操作,现在小A先移动,有多少种初始棋子的布局会使他胜利呢?

Input

共一行,三个数,n,k,d。

Output

输出小A胜利的方案总数。答案对1000000007取模。

Sample Input

10 4 2

Sample Output

182
【数据规模和约定】

对于100%的数据,有1<=d<=k<=n<=10000, k为偶数,k<=100。

HINT

Source

stage 2 day1

【分析】

很经典的题目,很不错。

我们将相邻的棋子看成一对,显然,在最后的情况下,每对棋子都是紧贴在一起的。

对于每对棋子,白棋在左边,黑棋在右边,那么白棋就只能往右边走,黑棋也只能往左边走,否则若白棋往左边,黑棋也可以往左边,情况不会有改变。

那么若将每对棋子之间的距离看成一堆石子的数量,就变成经典的nim游戏。

然后用nimk的理论做就行了。

DP有点难想...看代码就看得懂了

 1 /*
 2 唐代白居易
 3 《问刘十九》
 4 绿蚁新醅酒,红泥小火炉。
 5 晚来天欲雪,能饮一杯无。*/
 6
 7 #include <set>
 8 #include <map>
 9 #include <cmath>
10 #include <cstdio>
11 #include <vector>
12 #include <cstring>
13 #include <cstdlib>
14 #include <iostream>
15 #include <algorithm>
16 #define LOCAL
17 const int MAXL = 20;
18 const long long MOD = 1000000007;
19 const int MAXK = 10000 + 10;
20 const int MAXN = 10000 + 10;
21 using namespace std;
22 typedef long long ll;
23 ll f[100][MAXN * 2];
24 ll c[MAXK][1000], n, K, d;
25
26 ll C(ll a, ll b){
27    if (a == b) return 1ll;
28    //if (b > a - b) b = a - b;
29    return c[a][b] % MOD;
30 }
31 void prepare(){//预处理组合数
32      memset(c, 0, sizeof(c));
33      c[0][0] = 1;
34      for (ll i = 1; i <= 10005ll; i++){
35          c[i][0] = 1ll;
36          //if (i <= 210) c[i][i] = 1;
37          for (ll j = 1; j < min(i, 250ll); j++)
38          c[i][j] = (C(i - 1, j) + C(i - 1, j - 1)) % MOD;
39      }
40      //for (ll i = 1; i <= 50; i++)
41      //for (ll j = 0; j <= i; j++) printf("%d %d:%d\n", i, j, C[i][j]);
42      //printf("%d\n", C[10][2]);
43 }
44 void dp(){
45      K /= 2;
46      memset(f, 0, sizeof(f));
47      f[0][0] = 1;//第0位
48      for (ll i = 1; i <= 15; i++){
49          for (ll j = 0; j <= n - 2 * K; j++)//注意这一层不需要枚举到n了,因为只有这么多的空位
50          for (ll k = 0; (k * (d + 1) <= K) && (k * (d + 1) * (1ll<<(i - 1)) <= j); k++){
51              f[i][j] = (f[i][j] + (f[i - 1][j - k * (d + 1) * (1ll<<(i - 1))] * C(K, k * (d + 1))) % MOD) % MOD;
52
53          }
54      }
55      ll Ans = 0;
56      for (ll i = 0; i <= n - 2 * K; i++) Ans = (Ans + (f[15][i] * C(n - i - K * 2 + K, K)) % MOD) % MOD;
57      printf("%lld\n", (C(n, 2 * K) - Ans + MOD) % MOD);
58 }
59
60 int main(){
61
62     prepare();
63     scanf("%lld%lld%lld", &n, &K, &d);
64     dp();
65     //n的距离,k个石头,1~d次移动
66     return 0;
67 }

View Code

转载于:https://www.cnblogs.com/hoskey/p/4357482.html

【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋相关推荐

  1. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MB Submit: 626  Solved: 390 [Submit][Status ...

  2. BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  3. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  4. 【bzoj2281】[Sdoi2011]黑白棋

    博弈论---Nimk问题. dp再搞搞. 很容易看出,该游戏的终态是每两个棋子都紧靠着.当一颗棋子移动,另一方与该棋子对应的那一刻可以立即追上,使得仍旧紧靠,最终棋子动弹不得,游戏结束. 还能看出,对 ...

  5. bzoj 2281: [Sdoi2011]黑白棋 bzoj 4550: 小奇的博弈(Nimk博弈+DP)

    4550: 小奇的博弈 Time Limit: 2 Sec  Memory Limit: 256 MB Submit: 68  Solved: 42 [Submit][Status][Discuss] ...

  6. android 双人黑白棋开发博客,黑白棋 - 软件资讯 - 课堂党年级博客

    黑白棋叫反棋(Reversi).奥赛罗棋(Othello)苹棋翻转棋黑白棋西本流行游戏通相互翻转棋棋盘谁棋判断胜负 黑白棋棋盘8*8格棋盘棋棋空格间像围棋交叉点始棋盘两白两黑四棋交叉放置黑棋总先 自颜 ...

  7. P3084 黑白棋游戏

      P3084 黑白棋游戏 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和 ...

  8. 跟我一起使用 compose 做一个跨平台的黑白棋游戏(2)界面布局

    前言 在上一篇文章中,我们讲解了实现这个游戏的总体思路,这篇文章我们将讲解如何实现游戏界面. 本文将涉及到 compose 的自定义绘制与触摸处理,这些内容都可以在我往期的文章中找到对应的教程,如果对 ...

  9. 51nod 1368:黑白棋 二分图最大匹配

    1368 黑白棋 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  取消关注 有一个N*M的棋盘(1<=N,M< ...

  10. 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)

    原题及翻译 Othello is a game played by two people on an 8 x 8 board, using disks that are white on one si ...

最新文章

  1. Ubuntu apt-get install、apt-get -f install、apt-get --purge remove、apt-get update、apt-get upgrade、
  2. 技术图文:如何利用C# 实现 Prim 最小生成树算法?
  3. SQL SERVER 分区表的总结--一些疑问的总结
  4. 软件测试自动化的成功经验
  5. html边框有箭头,css简单实现带箭头的边框
  6. 4-1MapReduce概述
  7. discuz二次元文章博客模板
  8. android 结束if循环_几款Android反编译器对循环结构的还原能力测试记录
  9. 立即生效!英特尔 CEO 从云计算巨头 VMware 卸任
  10. html5 video标签兼容性与自定义控件
  11. Spring 通知和顾问进行增强
  12. 利用 SendInput 和INPUT结构 模拟鼠标移动
  13. accept - 指示打印系统接受发往指定目标打印机的打印 任务
  14. Java图形化实现LRU页面置换算法
  15. Windows 10 截图工具
  16. Web 前端通过调用ActiveX实现LPT1端口小票机打印功能。
  17. 这份关于高三的秘籍,一定要知道!
  18. javaSE学习笔记_目录
  19. 软件工程资料 - UCSD 怎么教软件工程
  20. 线性规划模型--解决投资问题

热门文章

  1. HTML5期末大作业:家具家居网站设计——智能家居(10页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 学生静态网页制作...
  2. VC2008界面编程
  3. 在VFP里玩SQL查询
  4. 计算机没wps云档怎么办,WPS云空间多大?WPS云文档空间已经用满怎么办?删数据或买VIP-太平洋电脑网...
  5. oa办公系统文件存取错误_出现文件存取错误解决方法
  6. python模拟账号登录_用Python(Tornado)模拟登录小米帐号
  7. 韦东山: 作为一个初学者,怎样学习嵌入式Linux?
  8. 新浪微博api接口java_Java调用新浪微博API【转】
  9. 笨方法学Python3 习题 0
  10. CSS中常见中文字体的英文名称(Microsoft YaHei,SimHei)