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 ...
随机推荐
- Mysql性能优化之---(二)
建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没 ...
- Reactor系列(八)concatMap有序映射
#java#reactor#comcatMap# 有序映射 视频讲解:https://www.bilibili.com/video/av79705356/ FluxMonoTestCase.java ...
- 2.6 数据库更新特定字段SQL/语句块
1.更新单表中某一字段 1.1适用于单条或者因为in条件1-1000条数据 下面是更改CMS_CONTRACT_INFO 表中合同编号为CMCC987最后更新时间为当前时间,或者注释里特定时间. UP ...
- spring-redis使用
导包 注入调用 opsForValue() opsForList() redisTemplate 配置 ,为了 对key采用string序列化方式 ...
- # 滚动Hash
滚动Hash 假设字符串\(C=c_1*c_2*...c_m\),定义Hash函数\(H(C)=(C_1*b^{m-1}+C_2*b^{m-2}+...C_m*b^{0})mod\; h\) 从k开始 ...
- Antd中,Form和Select联合使用,导致placeholder不生效分析
在使用antd的form组件时候,需要对Select组件进行语体示,placeholder,但是写的值并不生效 效果如上,但是现实的时候不生效,经检查发现,组件需要传递的是undefined,如果传入 ...
- 复习最短路 spfa+dijstra堆优化
题目很简单,, 但是wa了三次,, 用<vector>之前一定要记得clear()...简单说下 spfa的问题 和bell_forman有点类似 每次取出一个点 然后更新 并把更新了的节 ...
- Mybatis 多个参数传入的多种方法
ist<XXXBean> getXXXBeanList(HashMap map); <select id="getXXXBeanList" parameterTy ...
- C#从服务器下载文件的四种方式
//方法一:TransmitFile实现下载 string fileName = "ss.docx"; //客户端预设的文件名,导出时可修改 string filePath = ...
- winfrom_关于打印小票
1.使用的是PrintDocument控件,在工具箱 ,将其托到窗体上: 2. private void btnprint_Click(object sender, EventArgs e) { p ...