bzoj4806 炮——DP】的更多相关文章

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806 看到这题首先会想到状压什么乱七八糟的,然而很难做: 其实,因为求的是方案数,所以并不需要关注炮摆放的位置,而只需要关注数量: f[i][j][k] 表示第 i 行及以前共有 j 个有 0 炮的列和 k 个有 1 炮的列,就可以转移了. 代码如下: #include<iostream> #include<cstdio> #include<cstring> us…
炮 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 464  Solved: 243[Submit][Status][Discuss] Description 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子".  炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形 方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种. 棋子都是相…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806 这种题应该想状压的. 于是发现压不下,结合每一行每一列最多放两个炮想到记一下放炮的列就行. **又考虑到当前行能怎么放只与之前放0/1/2个炮的列数有关,与具体在哪一列无关. 于是记录一下前 i-1 行有多少列放了1/2个炮,就能顺利转移了. 别忘了考虑全所有情况. (转移条件只考虑数组不越界就行.像最后那个转移,j=0体现在*j上) #include<iostream> #inc…
bzoj4806——炮 题目传送门:bzoj4806 这种题一看就是dp...我们可以设$ f[i][j][k] $表示处理到第$ i $行,有$ j $列没放炮,$ k $列只放了一个炮.接着分情况讨论:第$ i $行不放炮.放一个炮.放两个炮:放在只有一个炮的列上,还是放在没炮的列上.于是就可以快乐地列方程了: $ \begin{equation} \begin{split} f[i][j][k] &= f[i-1][j][k] \\ &+ (j+1)\cdot f[i-1][j+1]…
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差不多的dp题 所以思路开始转向DP 经仔细思考后 将棋盘的状态压为三维 dp[i][k][j]; i:棋盘的第几行  k:前i行有几列放了一个炮棋  j:前i行有几列放了两个炮棋 因为炮会隔棋打,所以一列或者一行最多存在两个炮棋 所以 dp方程有6个元素: 1:不放炮棋,所以方程为 dp[i][k]…
哨戒炮 II 描述 你的防线成功升级,从原来的一根线变成了一棵树.这棵树有 N 个炮台,炮台与炮台之间 有 N-1 条隧道.你要选择一些炮台安装哨戒炮.在第 i 个炮台上安装哨戒炮得到的防御力为 vi.上次说过,哨戒炮离得太近会产生神奇的效果.具体来说,对于炮台 i,如果它安装了 哨戒炮且和 k 个哨戒炮用隧道直接相连,那么其防御力会变化 k*di.其中 di 为炮台 i 的抗 干扰属性值.如果为正,干扰对其有正的作用:为负,干扰对其有负的作用:为 0,则完全 不受干扰. 你的整套防线的防御力为…
题目描述 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子".  炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形 方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种. 棋子都是相同的. 输入输出格式 输入格式: 一行,两个正整数N和M. N<=100,M<=100 输出格式: 一行,输出方案数mod 999983. 输入输出样例 输入样例#1: 1 3 输出样例…
传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 b_i2333^i\),那么\(C_a^b \mod2333 = \prod\limits_{i=0}^5 C_{a_i}^{b_i} \mod 2333\) 可以认为Lucas就是将\(a,b\)两个数化成\(2333\)进制数之后每一位组合运算的乘积.似乎与数位相关,使用类似于数位DP的思考方式…
大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这一位没卡/卡了限制,的组合数之积,转移显然. WA 8发,都想抽死自己. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long long…
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡限制的贡献就很好dp了.为什么大家都要化式子呢. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<…
同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdio> #include<iostream> using namespace std; const int N=105,mod=999983; long long n,m,f[N][N][N],ans; int main() { scanf("%lld%lld"…
都是经典题了吧..我好无聊.. 4806 4806-1801是双倍经验..DP方程看代码吧.. /* http://www.cnblogs.com/karl07/ */ #include <cstdlib> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define ll long long //#d…
题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一行与前面两个相邻的情况,然后在除去与上面两行相邻的情况,因为涉及前面两行所以多设一维状态 dp[i][j][k]表示 第 i 行 状态为k时,第i - 1行状态为j, 那么dp[i][j][k] = max ( dp[i][j][k], dp[i - 1][t][j] + num[k]): num[…
Suppose that we have a square city with straight streets.  A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through which  to shoot.  The…
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上布置一片阿姆斯特朗回旋加速式阿姆斯特朗炮,那么在N行M列单位长度大小的地图上,求解阿姆斯特朗回旋加速式阿姆斯特朗炮最大的部署数量和对应部署方案总数. 输入 每组输入一行,为两个整数N,M (N <= 100:M <= 10) 输出 每组一行两个整数, 第一个为阿姆斯特朗回旋加速式阿姆斯特朗炮的个数…
炮(cannon)[题目描述] 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称“炮打隔子”. 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种. 棋子都是相同的.[输入说明] 一行,两个正整数N和M.[输出说明] 一行,输出方案数mod 999983.[样例输入] 1 3[样例输出] 7[数据范围] 对于40%的数据,N<=4,M<=4 对于…
题意:中文题. 思路,经典的状态压缩题目. 由于列长比较小,我们可以以行为阶段用状态压缩来做. 由于攻击只占两个格,这样从行的角度看,第i行的炮兵只与前i-1和前i-2行有关系.这样如果用j,k,l分别表示第i,i-1,i-2行的炮兵摆放状态,而num[i][j]表示第i个摆放状态为j时的炮兵个数.dp[i][k][j]表示以i为最后一行,倒数第一行摆放为j,倒数第二行摆放为k时的最优解. 这样得到状态转移方程dp[i][k][j]=max{dp[i-1][l][k]+num[i][j]},前提…
dp类:A - Bridging signals ZOJ 3627 POJ1631 HDU1950给出一个从1-n的数字排列,求最长上升子序列长度.直接说解法吧.新开一个数组d,d[i]表示的是能构成长度为i的上升子序列的在原序列中最后的那个数值.程序的主要过程:当循环到第i个的时候,如果原序列中的第i个数值大于之前d中保存的上升序列中长度最长的那个最后的值,那么,就把当前记录的最长的子序列的长度+1,然后把这个值加到d的末尾:如果不大于,那么就从前面二分找到这个值,d中的序列一定是有序的,找到…
dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace std;   typedef long long ll;   co…
题解: 二营长!你他娘的意大利炮呢? dp[i][j][0]: 从i,跋涉到以i为根的子树的每一个节点,在第j个数位上一共产生了多少个0. dp[i][j][1]: 从i,跋涉到以i为根的子树的每一个节点,在第j个数位上一共产生了多少个1. 转移式:(cur为i的儿子,t = (a[i]>>j)&1) dp[i][j][0^t] += dp[cur][j][0]; dp[i][j][1^t] += dp[cur][j][1]; 初始化: dp[i][j][0] = (t==0); dp…
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法 100%的数据中N,M不超过100 容易发现每行每列最多两个 然后就不会了...看了别人的状态表示: $f[i][j][k]$表示前$i$行有$j$列放了$1$个$k$列放了$2$个 因为只有那些行放了几个影响当前转移 然后转移自己随便写写就行了....注意$j$可能需要减 $1A$啦啦啦…
嗯,作为一只蒟蒻,今天再次学习了状压dp(学习借鉴的博客) 但是,依旧懵逼·································· 这篇学习笔记是我个人对于状压dp的理解,如果有什么不对的地方,希望大家指出. 闲话不多说,进入正题. 首先,在介绍状压dp之前,我们先来了解一下状态压缩(常用的为二进制,why?[因为其他的我不会]). 什么是状态压缩呢?顾名思义,就是将数转换为二进制来进行一些操作. 基本操作: 看完基本操作,我们来看一下一些稍微复杂的操作. 操作 运算 取出整数n在二…
题意:在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 题解:dp[i][j][k]表示到了第i行,有j列含1个炮,k列含2个炮,转移随便搞就行了 /************************************************************** Problem: 1801 User: walfy Language: C++ Result: Accepted Time:356…
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 输入输出格式 输入格式: 一行包含两个整数N,M,之间由一个空格隔开. 输出格式: 总共的方…
Description 在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮 Solution 定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 j, 有1个炮的列数 为k, 的方案数有多少. 然后就能非常简单的写个dp了 Code #include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define rep(i,a,b…
计数dp 计数类的$dp$没做过几个,所以之前都放到"思维"标签下了,后来发现原来这属于一类问题啊...搬过来了. 管道取珠:https://www.lydsy.com/JudgeOnline/problem.php?id=1566 题意概述: 有这样的两根管道接在一起,上边有$n$个珠子,下边有$m$个,每次可以从上或下取出一个(向右滑出去),只会有两种颜色的珠子,求不同的取珠序列的总数的平方和.(只要两个取出序列的珠子颜色都相同就视为相同的序列,不用考虑上下).$n,m<=3…
印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit: 65536K Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部…
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如…
1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1995  Solved: 1160[Submit][Status][Discuss] Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较…
BZOJ1801 Ahoi2009 chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sample Input 1 3 Sample Output 7 HINT 除了在3个格子中都放满炮的的情况外,其它的都可以. 100%的数据中…