洛谷 P2051 [AHOI2009]中国象棋 解题报告

P2051 [AHOI2009]中国象棋

题目描述

这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!

输入输出格式

输入格式:

一行包含两个整数N,M,之间由一个空格隔开。

输出格式:

总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。

说明

样例说明

除了3个格子里都塞满了炮以外,其它方案都是可行的,所以一共有222-1=7种方案。

数据范围

100%的数据中N和M均不超过100

50%的数据中N和M至少有一个数不超过8

30%的数据中N和M均不超过6


一开始想打状压,但最后没时间了(校内开的考试)没打完,据说有50分。

对应状压的话,我们用两位来存储第i行是当前列已经存在几个炮。

分析一下发现,其实我们并不关注炮到底在哪里,只关心这一列有多少个(我感觉跟SDOI2010 地精部落有那么一点点的共同之处)

有时候,我们描述一个状态时,只关心其中某些的数量,而并不关系它的具体位置,转而用数学方法计算

\(dp[i][j][k]\)代表目前到前i行 所有列 0放j个(即有\(j\)列还没放炮) 1放k(有\(k\)列已经放了一个炮)个的方案数

转移方程在代码里。


Code:

#include <cstdio>
#define ll long long
const int N=104;
const int mod=9999973;
ll n,m,dp[N][N][N],ans=0;
//dp[i][j][k]代表前i行 所有列 0放j个 1放k个的方案数
int main()
{scanf("%lld%lld",&n,&m);dp[0][m][0]=1;for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;k<=m-j;k++){dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod;//这排啥也不放if(k) dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+1][k-1]*(j+1))%mod;//一个0放1dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k+1]*(k+1))%mod;//一个1放2if(k>1) dp[i][j][k]=(dp[i][j][k]+(j+2)*(j+1)/2*dp[i-1][j+2][k-2])%mod;//双0放1dp[i][j][k]=(dp[i][j][k]+(k+2)*(k+1)/2*dp[i-1][j][k+2])%mod;//双1放2dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+1][k]*(j+1)*k)%mod;//0,1各1}for(int i=0;i<=m;i++)for(int j=0;j<=m-i;j++)ans=(ans+dp[n][i][j])%mod;printf("%lld\n",ans);return 0;
}

2018.6.19

转载于:https://www.cnblogs.com/butterflydew/p/9200697.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VirtualDOM与diff(Vue实现)

写在前面 因为对Vue.js很感兴趣&#xff0c;而且平时工作的技术栈也是Vue.js&#xff0c;这几个月花了些时间研究学习了一下Vue.js源码&#xff0c;并做了总结与输出。文章的原地址&#xff1a;https://github.com/answershuto/learnVue。在学习过程中&#xff0c;为Vue加上了…

使用Java的RESTful Web服务

REST代表“代表性状态转移”&#xff0c;由Roy Fielding于2000年在其论文“建筑风格和基于网络的软件体系结构设计”中首次提出。 REST是一种建筑风格。 HTTP是一种协议&#xff0c;其中包含一组REST体系结构约束。 REST基础 REST中的所有内容都被视为资源。 每个资源都由UR…

android 基础应用程序,android应用程序基本实现(基础篇).ppt

《android应用程序基本实现(基础篇).ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《android应用程序基本实现(基础篇).ppt(22页珍藏版)》请在人人文库网上搜索。1、Android应用程序基本实现,复杂的应用,上节课&#xff0c;我们实现了一个基本的android的应用程序…

windows npm安装webpack

Webpack: Webpack 是一个前端资源加载/打包工具。 它将根据模块的依赖关系进行静态分析&#xff0c;然后将这些模块按照指定的规则生成对应的静态资源。 参考下图&#xff1a; 安装Webpack: 1.首先需要安装node.js&#xff08;npm&#xff09; 下载地址&#xff1a;node.js dow…

ThreadLocal如何实现?

这是我上周的帖子的后续文章&#xff0c;在那篇文章中我解释了ThreadLocal用法的动机 。 从帖子中我们可以回想起&#xff0c;如果您希望每个线程都有一个独立初始化的变量副本&#xff0c;则ThreadLocal确实是一个很酷的概念。 现在&#xff0c;好奇的人可能已经开始问“我如何…

WPFの操作文件浏览框几种方式

WPFの操作文件浏览框几种方式 原文:WPFの操作文件浏览框几种方式方式1&#xff1a; 使用win32控件OpenFileDialog Microsoft.Win32.OpenFileDialog ofd new Microsoft.Win32.OpenFileDialog(); ofd.DefaultExt ".xml"; ofd.Filter "xml file|*.xml"; if…

为什么你应该尝试@reach/router

最近react-router的一个作者另外写了一个类react-router的组件 reach/router&#xff0c;尝试后感觉太棒了。如果你的项目只是web端的话我认为可以把你的react-router换掉了。下面是我到目前看到的所有非常好的点。 小&#xff0c;就4kb,压缩后比react-router小40kb左右。 更少…

android 浏览器 div穿透,解决IE 上重叠div 对 mouseover 事件的穿透方法之一

解决IE 下重叠div 对 mouseover 事件的穿透方法之一? ? ? ? 历经一天半的时间&#xff0c;我这前端的白痴终于想到了一个解决IE 下重叠div ?对 mouseover 事件的穿透方法。??现象&#xff1a; 两个并列关系的Div(没有父子关系)&#xff0c;但是两个Div在位置上面有重叠&…

类加载器工作机制

类加载器工作机制&#xff1a;1.装载&#xff1a;将Java二进制代码导入jvm中&#xff0c;生成Class文件。2.连接&#xff1a;a&#xff09;校验&#xff1a;检查载入Class文件数据的正确性 b&#xff09;准备&#xff1a;给类的静态变量分配存储空间 c&#xff09;解析&#xf…

webviewjavascriptbridge android ios,js与ios交互使用WebViewJavascriptBridge如何写多个函数

//js与webview交互初始化function setupWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {return callback(WebViewJavascriptBridge);}if (window.WVJBCallbacks) {return window.WVJBCallbacks.push(callback);}window.WVJBCallbacks [callback];v…

JavaFX中的塔防

我想长时间使用我的游戏引擎来编写《塔防》游戏&#xff0c;但是由于另一个小组努力创建JavaFX《塔防》游戏&#xff0c;所以我认为我宁愿创建另一款游戏。 从邮件列表中&#xff0c;我了解到不再开发其他游戏。 因此&#xff0c;我决定尝试一下。 塔防是一款非常适合基于图块…

CSS pointer-events属性的使用

楔子 在前端的开发中&#xff0c;我们都是直接与用户接触&#xff0c;应该尽量让用户感到操作畅快愉悦&#xff0c;获得类似native的感觉。其中动画是最常用的方法。 这里的需求是&#xff0c;弹层的设计&#xff0c;这个弹层希望可以像 native 上的弹层一样&#xff0c;点击…

海思NB-IOT的SDK看门狗的使用

1. 看门狗需要喂狗&#xff0c;如果自己写的任务一直运行&#xff0c;那么空闲任务无法运行会导致看门狗复位&#xff0c;来看下看门狗的机制&#xff0c;首先系统启动的时候创建了空闲任务 在这个函数里面void vTaskStartScheduler( void )创建了下面的空闲任务 xReturn xTas…

分布式Session框架

分布式Session框架 配置服务器&#xff0c;Zookeeper集群管理服务器可以统一管理所有服务器的配置文件共享这些Session存储在一个分布式缓存中&#xff0c;可以随时写入和读取&#xff0c;而且性能要很好&#xff0c;如Memcache&#xff0c;Tair。封装一个类继承自HttpSession&…

向您的JVM添加一些熵

能否生成真正的随机数取决于系统中的熵。 有人声称&#xff0c;这可以通过掷骰子来保证。 其他人认为&#xff0c;用此主体替换OpenJDK的java.math.Random.nextInt&#xff08;&#xff09;方法将有所帮助&#xff1a; public int nextInt() {return 14; }资料来源&#xff1a…

android源码多少行,Android源码资料

缺点&#xff1a;有时会访问不了优点&#xff1a;搜索方便&#xff0c;支持跳转引用)一个操作的小技巧&#xff0c;不想跳转引用的类覆盖当前页面&#xff0c;可以按下ctrl键点击。https://www.cnblogs.com/CVstyle/p/6395662.htmlhttps://www.jianshu.com/p/25a908c7eefaAndro…

Android初学第80天

Android初学第80天 20_MVVM 代码 BeatBox BeatBox.java package com.bignerdranch.android.beatbox;import android.content.Context; import android.content.res.AssetManager; import android.util.Log;import java.io.IOException; import java.util.ArrayList; import jav…

深入理解JavaScript之Event Loop

前言 最近阅读《高性能JavaScript》时&#xff0c;第六章谈到“通过定时器将JavaScript执行代码的控制权先让给浏览器用于更新UI状态&#xff0c;然后再将控制权交回给JavaScript代码&#xff0c;这样就可以使得页面更为流畅”&#xff0c;就联想到了之前理解的事件循环。 这…

使用EasyPoi导出Excel

Excel模板来自自己写死的一个excel模板&#xff0c;相当于是用户查询数据&#xff0c;数据填充到一个模板的Excel里&#xff0c;再导出Excel /*创建模板*/String a request.getSession().getServletContext().getRealPath("/resource/河南能源化工集团安全监控系统联网系统…

Hazelcast入门

7月&#xff0c;我写了一个博客向Java开发人员介绍erlang&#xff0c;重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能&#xff0c;其中之一是它们独立于位置并且可以互相通信。 这意味着可以通过编写很少的代码行在VM之间同步数据。 如果您…