题意 题目链接 Sol 一个不太容易发现但是又很显然的性质: 如果有两个相邻的红格子,那么第一问答案为0, 第二问可以推 否则第一问答案为偶数格子上的白格子数,第二问答案为偶数格子上的红格子数 #include<bits/stdc++.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se second //#define int long long #d…
[BZOJ1802][AHOI2009]checker(动态规划) 题面 BZOJ 洛谷 题解 首先自己观察一波,发现如果有相邻两个格子都是红色的话,那么显然可以在任意位置都存在一个跳棋.可以让两个位置反复互相跳就好了.这样子第一问的答案显然就是\(0\),否则的话第一问的答案就是偶数位置上\(0\)的个数. 如果没有相邻的两个位置都是红格子,我们还可以得出第二问的答案就是偶数位置上红格子的数目. 现在有两个红格子相邻,设\(f[i]\)表示在\(i\)这个位置要出现一个棋子的最小加入的跳棋数目…
题目描述 若有两个红格相邻 第一问的答案为0,所有位置上的棋子都可以通过在这两个格子上放棋子得到 第二设f[i]表示想让第i个格子上有棋子需要放的棋子数 若没有,第一问答案为偶数格子上白格的个数,第二问为偶数格子上红格的个数 #include<complex> #include<cstdio> #include<cstring> using namespace std; ; int n; bool flag; long long f[N]; bool a[N]; int…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
[BZOJ1801][AHOI2009]中国象棋(动态规划) 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 输入格式: 一行包含两个整数N,M,之间由一个空格隔开. 输出格式: 总共的方案数,由于该值可能很大,只需给出方…
[BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原数的余数直接记下来,然后就很好写了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long l…
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 题目大意 在一个n*m的棋盘中,求任意行和任意列上最多有2个棋子的方案总数. 感想 真的是一道DP好题,状态,转移方程都非常的难想,我也WA了好几发. 分析 看到题目,很明显可以发…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1801 题意概括 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. n,m<=100 题解 其实就是不出现3炮共线就可以了. 用dp[i][j][k]表示前i行,有j列还可以放1个跑,有k列还可以放2个跑的方案总数. 然后对于每一行,分别按照放0.1.2个炮进行转移. 放0个跑,那么就是: dp[i+1]…
思路 好像是一道挺水的计数的,不知道为什么会是紫题 显然每行和每列最多放两个 首先考虑状压,然后发现三进制状压可做,但是三进制太麻烦了,可以拆成两个二进制,一个表示该列是否是放了一个的,一个表示该列是否是放了两个的 可以发现并不需要知道具体每列放了什么,只需要知道有几个即可,所以把有几列放了一个和有几列放了两个表示进状态中,滚动数组优化一下空间即可 状态转移在代码中 代码 #include <cstdio> #include <algorithm> #include <cst…
点此看题面 大致题意: 让你在一张\(N*M\)的棋盘上摆放炮,使其无法互相攻击,问有多少种摆法. 辟谣 听某大佬说这是一道状压\(DP\)题,于是兴冲冲地去做,看完数据范围彻底懵了:\(N≤100\)!这么大的数据范围压死你! 好吧,其实这就是一道普通的\(DP\),与状压没有任何关系. 其实状压可以用来骗分,能得50. 考虑性质 对于这种题目,第一步肯定是考虑有没有什么比较重要的性质. 考虑炮的攻击方法,应该不难发现,每一行.每一列放的炮的数量不能超过\(2\). 保证每行不超过\(2\),…