炮(棋盘DP)
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp
首先看一下题目
嗯,象棋 ,还是只有炮的象棋
对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃
然后记得以前有过和这个题差不多的dp题
所以思路开始转向DP
经仔细思考后 将棋盘的状态压为三维
dp[i][k][j];
i:棋盘的第几行 k:前i行有几列放了一个炮棋 j:前i行有几列放了两个炮棋
因为炮会隔棋打,所以一列或者一行最多存在两个炮棋
所以
dp方程有6个元素:
1:不放炮棋,所以方程为 dp[i][k][j]+=dp[i-1][k][j];
2:往一个没有炮棋的列放一个炮棋,方程为dp[i][j][k]+=dp[i-1][k-1][j]*(m-k-j+1);
3:往一个有一个炮棋的列放一个炮棋,方程为dp[i][j][k]+=dp[i-1][k+1][j-1]*(k+1);
4:往一个有一个炮棋的列放一个炮棋同时往一个没有炮棋的列放一个炮棋,方程为dp[i][j][k]+=dp[i-1][k][j-1]*(k)*(m-j-k+1)/2;
5:往一个有一个炮棋的列放一个炮棋同时往一个有一个炮棋的列放一个炮棋,方程为dp[i][k][j]+=(k+2)*(k+1)/2*dp[i-1][k+2][j-2];
6:往一个没有炮棋的列放一个炮棋同时往一个没有炮棋的列放一个炮棋,方程为dp[i][k][j]+=(m-j-k+2)*(m-j-k+1)/2*dp[i-1][k-2][j];
好了,现在可以贴代码了
- #include<cstdio>
- #include<iostream>
- #define mod 999983
- using namespace std;
- int n,m;
- long long int dp[][][],ans=;
- int main()
- {
- scanf("%d%d",&n,&m);
- dp[][][]=;
- for(int i=;i<=n;i++)
- {
- for(int k=;k<=m;k++)
- {
- for(int j=;j<=m-k;j++)
- {
- dp[i][k][j]=dp[i-][k][j];
- if(k) dp[i][k][j]+=(m-k-j+)*dp[i-][k-][j]%mod;
- if(j&&k<m) dp[i][k][j]+=(k+)*dp[i-][k+][j-]%mod;
- if(k>) dp[i][k][j]+=(m-j-k+)*(m-j-k+)/*dp[i-][k-][j]%mod;
- if(j>&&k<m-) dp[i][k][j]+=(k+)*(k+)/*dp[i-][k+][j-]%mod;
- if(k&&j) dp[i][k][j]+=(m-j-k+)*(k)*dp[i-][k][j-]%mod;
- dp[i][k][j]%=mod;
- }
- }
- }
- for(int i=;i<=m;i++)
- {
- for(int j=;j<=m-i;j++)
- {
- ans+=dp[n][i][j];
- ans%=mod;
- }
- }
- printf("%lld\n",ans);
- return ;
- }
炮(棋盘DP)的更多相关文章
- P1006 传纸条[棋盘DP]
题目来源:洛谷 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接 ...
- hdu2067 小兔的棋盘 DP/数学/卡特兰数
棋盘的一角走到另一角并且不越过对角线,卡特兰数,数据量小,可以当做dp求路径数 #include<stdio.h> ][]; int main() { ; ) { int i,j; lon ...
- [BZOJ4813][CQOI2017]小Q的棋盘(DP,贪心)
4813: [Cqoi2017]小Q的棋盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 804 Solved: 441[Submit][Statu ...
- 1219 骑士游历(棋盘DP)
1997年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如 ...
- codevs——1169 传纸条(棋盘DP)
2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小渊和小 ...
- codevs——1010 过河卒(棋盘DP)
2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 如图,A 点有 ...
- Luogu P1004/P1006 方格取数/传纸条 【棋盘Dp】 By cellur925
我明明记得写过这篇啊qwq为什么会搞丢 两题几乎一样. 如果再拓展到k条路,就要用网络流跑了,本蒟现在还不会. 我们容易想到四维dp,但是有一种更好的方法. 首先,先从左上到右下.再从右下到左上可以近 ...
- POJ 1185 炮兵阵地 (状压dp)(棋盘dp)
这题和poj 3254很像,但是更复杂了一些 都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值 (1)上一道题距离要大于1,这道题是大于2.所以判断的时候变成 !(x & (x ...
- Bzoj 4806 炮 (dp)
题目描述 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘 ...
随机推荐
- pip安装教程
首先你得安装了Python,这个网上教程大把. 关于pip的安装教程网上也很多,但是安装过程中遇到了很多问题. 我把安装pip需要的资源都放到云盘上了,直接下载就行,省得去找.(点我下载) 里面有两个 ...
- JavaScript强化教程——jQuery AJAX 实例
什么是 AJAX?AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML).简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据 ...
- 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00
武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...
- Merry Christmas & Happy New Year!!
圣诞快乐,新年快乐!
- Android的进程等级
Android五个进程等级 1.前台进程(Foreground process): 用户当前工作所需要的.一个进程如果满足下列任何条件被认为是前台进程: 正运行着一个正在与用户交互的活动(Activi ...
- 【代码笔记】iOS-翻书效果的实现
代码: RootViewController.m #import "RootViewController.h" @interface RootViewController () @ ...
- 【读书笔记】iOS网络-优化请求性能
一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所能提供的理论带宽是很高的.不 ...
- socket编程中客户端常用函数 以及简单实现
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
- Markdown语法手册
Markdown 语法手册 Markdown 是一种轻量级标记语言,能将文本换成有效的XHTML(或者HTML)文档,它的目标是实现易读易写,成为一种适用于网络的书写语言. Markdown 语法简洁 ...
- 创建用户故事地图(User Story Mapping)的8个步骤
[小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...