HDU 6415 Rikka with Nash Equilibrium (计数DP)
题意:给两个整数n,m,让你使用 1 ~ n*m的所有数,构造一个矩阵n*m的矩阵,此矩阵满足:只有一个元素在它的此行和此列中都是最大的,求有多种方式。
析:根据题意,可以知道那个元素一定是 n * m,因为这个数是最大的,不会有其他可能了,我们考虑从大小到的顺序放,先放最大的,再放次大的,那么想想次大的位置应该是在哪呢,必然是在最大数的所有的行或者是所有的列,因为如果不这样做,那么它一定也是它所在行和列中最大的了,就不满足条件了,同样再放第三大的,也是要放到第一大或者是第二大的所有行或者是列中,同理其他也是这样。所以就有了状态方程,dp[i][j][k] 表示,i 行中已经放过数,j 列中已经放过数了,最后放的数是 k,因为正着放和反着放结果是一样的,所以我们可以正着放,也就是按照 1 ~ n*m放,转移方程如下:
1.考虑先增加新的一行,那么就是在已经存在的所有列中选择一列,然后再在该列中选择一个位置(此位置不能是行与列的交叉点)也就 dp[i][j][k] = dp[i-1][j][k-1] * j * (n-i+1)
2.考虑都加新的一列,那么就是在已经存在的所有行中选择一行,然后再在该列中选择一个位置(此位置不能是行与列的交叉点),也就是 dp[i][j-1][k-1] * i * (m-j+1)
3.考虑放到行与列的交叉点上,dp[i][j][k] = dp[i][j][k-1] * (i*j-k+1)。
再考虑可以使用滚动数组进行优化,当然也可以不用优化。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 80 + 7;
int n, m;
int dp[2][maxn][maxn]; int main(){
int T; scanf("%d", &T);
while(T--){
int K;
scanf("%d %d %d", &n, &m, &K);
memset(dp[0], 0, sizeof dp[0]);
dp[0][1][1] = n * m % K;
int cur = 1;
for(int k = 2; k <= n * m; ++k, cur ^= 1){
memset(dp[cur], 0, sizeof dp[cur]);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j){
if(i * j < k) continue;
dp[cur][i][j] = ((LL)dp[cur^1][i][j] * (i*j-k+1) % K + (LL)dp[cur^1][i-1][j] * j * (n-i+1) % K + (LL)dp[cur^1][i][j-1] * i * (m-j+1)% K) % K;
}
}
printf("%I64d\n", dp[cur^1][n][m]);
}
return 0;
}
HDU 6415 Rikka with Nash Equilibrium (计数DP)的更多相关文章
- [hdoj6415 Rikka with Nash Equilibrium][dp]
http://acm.hdu.edu.cn/showproblem.php?pid=6415 Rikka with Nash Equilibrium Time Limit: 10000/5000 MS ...
- HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)
Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K ...
- 杭电多校第九场 HDU6415 Rikka with Nash Equilibrium dp
Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K ...
- 【杂题总汇】HDU2018多校赛第九场 Rikka with Nash Equilibrium
[HDU2018多校赛第九场]Rikka with Nash Equilibrium 又是靠这样一道题擦边恰好和第两百名分数一样~愉快
- HDU6415 Rikka with Nash Equilibrium
HDU6415 Rikka with Nash Equilibrium 找规律 + 大数 由于规律会被取模破坏,所以用了java 找出规律的思路是: 对于一个n*m的矩阵构造,我先考虑n*1的构造,很 ...
- hdu6415 Rikka with Nash Equilibrium (DP)
题目链接 Problem Description Nash Equilibrium is an important concept in game theory. Rikka and Yuta are ...
- HDU 6377 度度熊看球赛 (计数DP)
度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- hdu-6415 Rikka with Nash Equilibrium dp计数题
http://acm.hdu.edu.cn/showproblem.php?pid=6415 题意:将1~n*m填入一个n*m矩阵 问只有一个顶点的构造方案. 顶点的定义是:某数同时是本行本列的最大值 ...
- HDU 6086 Rikka with String AC自动机 + DP
Rikka with String Problem Description As we know, Rikka is poor at math. Yuta is worrying about this ...
随机推荐
- Charles系列一:Charles功能介绍、下载安装和界面简介
一:Charles主要功能介绍 Charles是一个HTTP代理/HTTP监视器/反向代理,使开发和测试人员能够查看机器和Internet之间所有的HTTP和SSL/HTTPS流量,这包括请求,响应. ...
- 淘宝客类别id大全
汽车/用品/配件/改装 例 [ID:26] 家居饰品 例 [ID:50020808] 特色手工艺 例 [ID:50020857] 景点门票/度假线路/旅游服务 例 [ID:50025707] 男装 例 ...
- hdoj3586 (树形dp)
题目链接:https://vjudge.net/problem/HDU-3586 题意:一棵边权树,要删掉一些边使得每个叶子结点不能到达树根,且这些边的权值<=上限Max,且边权和小于m,求最小 ...
- msyql 主从切换
从库是192.168.1.70 ,主库是192.168.1.64,主从切换一次 即:主库是192.168.1.70,从库是192.168.1.64 1.从库上执行,修改为主 修改从库为非只读库修改配置 ...
- ThreadLocal父子线程之间的数据传递问题
一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取 ...
- http无状态和鉴权解决四种方案
http协议本身是无状态的,但是在实际的web开发中常有一些操作需要有状态.比如想要访问一些私人访问权限的文章,或者这种操作需要明确当前用户身份. 显然,最简单的方案就是每次都发送账户和密码,但是这样 ...
- QQ浏览器、搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie、Session失效问题
原文:QQ浏览器.搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie.Session失效问题 这些狗日的浏览器在兼容模式下,保存Cookie会失败,是因为SameSiteMode默认为La ...
- VS显示方法引用
菜单栏 工具->选项->文本编辑器->所有语言->CodeLens 勾上即可
- phpspider爬虫框架的使用
这几天使用PHP的爬虫框架爬取了一些数据,发现还是挺方便的,先上爬虫框架的文档 phpspider框架文档 使用方法其实在文档中写的很清楚而且在demo中也有使用示例,这里放下我自己的代码做个笔记 & ...
- JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
js 笛卡尔积算法的实现代码,据对象或者数组生成笛卡尔积,并介绍了一个javascript多重数组笛卡尔积的例子,以及java实现笛卡尔积的算法与实例代码. 一.javascript笛卡尔积算法代码 ...