【题解】棋子

题目描述

  小Z在家闲得无聊,摆弄起了围棋棋子。也许是小Z有自虐倾向,他出了个难题给自己,结果竟然把自己难住了。你作为他的朋友,决定帮助他解决难题。

  有一个m×n的棋盘,需要在上面摆满黑白棋子。小Z有一个奇怪的规则:如果有两个棋子相邻(上下左右),且一白一黑。则黑的必须在上面(或左边)。黑白棋子都是足够多的。小Z想知道共有多少种不同的摆法(只要略有不同就算一种)。

输入格式

  一行,包括两个正整数m和n。

输出格式

  一行,包括一个正整数ans,表示共有多少种不同的摆法。

输入样例

2 2

输出样例

6

样例说明

  6种摆法分别为:

  oo | ×× | ×× | ×o | ×× | × o

  oo | ×× | o o | ×o | × o | o o

  (×表示黑子,o表示白子)

数据规模

  对于50%的数据满足,2≤m,n≤16;

  对于100%的数据满足,2≤m,n≤30。

题解

  我们设$dp[i][j]$为$(i,j)$到$(m,n)$范围内的矩形的方案数。

  容易想到$dp[m][n] = 2$(一黑一白)。

  这里也可以推得边界$dp[i][n] = dp[i + 1][n] + 1,dp[m][j] = dp[m][j + 1] + 1$,意思是开头加上一个黑色棋子的情况加上全部都是白棋子的情况。

  这里先给出普遍的公式$dp[i][j] = dp[i + 1][j] + dp[i][j + 1]$。

  “$dp[i + 1][j]$”表示第$i$行全放上黑棋子,“$dp[i][j + 1]$”表示第$j$列全放上黑棋子。

  为什么是全放上呢?其实第$i$行(第$j$列)放一部分黑和放一部分白的情况已经包含在$dp[i][j+ 1]$($dp[i + 1][j]$)里了。

  可以发现按照上面的说法,统计了$2$次全是黑棋的情况,但是又没有统计全是白棋的情况,所以“$+1$”和“$-1$”相互抵消了。

#include <iostream>
#include <algorithm>
#include <cmath>

#define MAXM 32
#define MAXN 32

using namespace std;

int m, n;
long long f[MAXM][MAXN];

int main()
{
    cin >> m >> n;
    f[m][n] = 1;
    for(register int i = m - 1; i >= 1; i--)
    {
        f[i][n] = f[i + 1][n] + 1;
    }
    for(register int j = n - 1; j >= 1; j--)
    {
        f[m][j] = f[m][j + 1] + 1;
    }
    for(register int i = m - 1; i >= 1; i--)
    {
        for(register int j = n - 1; j >= 1; j--)
        {
            f[i][j] = f[i][j + 1] + f[i + 1][j] + 1;
        }
    }
    cout << f[1][1] + 1;
    return 0;
} 

参考程序

原文地址:https://www.cnblogs.com/kcn999/p/10805791.html

时间: 2024-10-08 06:02:22

【题解】棋子的相关文章

bzoj 3519: [Zjoi2014] 消棋子 题解

[序言]在大家怀疑的眼光下,我做了一个中午和半个下午.调了一个晚上的题目总算A了! [原题] 消棋子是一个有趣的游戏.游戏在一个r * c的棋盘上进行.棋盘的每个格 子,要么是空,要么是一种颜色的棋子.同一种颜色的棋子恰好有两个.每一轮, 玩家可以选择一个空格子(x, y),并选择上下左右四个方向中的两个方向,如果 在这两个方向上均存在有棋子的格子,而且沿着这两个方向上第一个遇到的棋子 颜色相同,那么,我们将这两个棋子拿走,并称之为合法的操作.否则称这个操 作不合法,游戏不会处理这个操作.游戏的

【题解】魔术棋子

题目描述 在一个M×N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod)K可以为几? 如以下2×3棋盘: 3 4 4 5 6 6 棋子初始数为1,开始从左上角进入棋盘,走到右下角,上图中,最后棋子上的数可能为288,432或540.所以当K=5时,可求得最后的结果为:0,2,3. 输入输出格式 输入格式 第一行为三个数,分别为M,N,K(1≤M,N,  K≤100):

[题解] [CQOI2011] 放棋子

题面 题解 为了练习计数而做 注意到一种颜色占据的行, 列其他的颜色不能放 又考虑到我们并不需要知道哪些行哪些列选了, 只需要知道还有几行几列没选即可 于是有 \(f[i][j][k]\) 代表前 \(i\) 种颜色选完之后, 还有 \(j\) 行没选, \(k\) 列没选的方案数 \(g[i][j][k]\) 代表, \(i\) 个棋子, 放在 \(j\) 行 \(k\) 列中并且没有空行空列的方案数 \(cnt_i\) 代表颜色为 \(i\) 的棋子有几个 有 \[ \displaystyl

【题解】CQOI2012交换棋子

感受到网络流的强大了--这道题目的关键在于: 前后颜色不变的,流入流出的次数相等:原本是黑色的最后变成了白色,流出比流入次数多1:原本是白色最后变成黑色,流入比流出次数多一.所以我们将每一点拆成3个点,分别代表流入点,原点与流出点.最开始为黑色的点与源点连流量为1,费用为0的边,最后为黑色的点与汇点连流量为1,费用为0的边. #include<bits/stdc++.h> using namespace std; #define maxn 300 #define maxm 8000 #defi

cumt周练题解

cumt2017春季--周练(一) A.CodeForces - 785A 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n; 6 cin >> n; 7 map<string, int>ma; 8 ma["Tetrahedron"] = 4; 9 ma["Cube"] = 6; 10 ma["Octahedron&quo

bzoj4563[Haoi2016]放棋子

bzoj4563[Haoi2016]放棋子 题意: 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列.要求你放N枚棋子(障碍的位置不能放棋子),也满足每行只有一枚棋子,每列只有一枚棋子的限制,求有多少种方案.N≤200. 题解: 发现在障碍在什么位置和答案无关.因此可以把棋子摆成左上-右下对角线,然后就是错排问题(一个长度为n的排列,要求每个元素不能放在与自己编号相同的位置上,问有多少种方案满足条件)了.错排公式:f[i]=(f[i-1]+f[i-2]

洛谷 P1219 八皇后 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1219 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳

[题解+总结]动态规划大合集II

1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2.lis 最长上升子序列 唯一一道裸题,但是O(n^2)过不了,临时看了看O(n log n)的二分做法和线段树做法.先来讲讲简单的二分做法,其本质就是在O(n^2)上进行优化,需要证明一个结论.设当前处理数列第k位,存在: (1)a[i]<a[j]<a[k]: (2)i<j<k: (3

CodeForces 281 题解

A题: 题意:给出按照时间顺序的比赛记录,比赛记录了哪一分钟有哪位球员得到了黄牌或红牌,输出罚下的人的序列. 题解:直接按照时间读入模拟就可..注意坑在有可能一位球员罚下后又得到黄牌或红牌,这时候不应再输出这个人了. B题: 题意:给出两个摔跤选手每个动作的得分,正数为第一个人得分负数为第二个人得分,总分高者胜,若相同则“字典序”较大的获胜,再相同则最后得分的人获胜. 题解:直接模拟就可..要用long long.. C题: 题意:两个队伍篮球比赛,给出每个队伍投进的每个球距离球框的距离,现在要