题意:给两个整数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)的更多相关文章

  1. [hdoj6415 Rikka with Nash Equilibrium][dp]

    http://acm.hdu.edu.cn/showproblem.php?pid=6415 Rikka with Nash Equilibrium Time Limit: 10000/5000 MS ...

  2. HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)

    Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  3. 杭电多校第九场 HDU6415 Rikka with Nash Equilibrium dp

    Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  4. 【杂题总汇】HDU2018多校赛第九场 Rikka with Nash Equilibrium

    [HDU2018多校赛第九场]Rikka with Nash Equilibrium 又是靠这样一道题擦边恰好和第两百名分数一样~愉快

  5. HDU6415 Rikka with Nash Equilibrium

    HDU6415 Rikka with Nash Equilibrium 找规律 + 大数 由于规律会被取模破坏,所以用了java 找出规律的思路是: 对于一个n*m的矩阵构造,我先考虑n*1的构造,很 ...

  6. hdu6415 Rikka with Nash Equilibrium (DP)

    题目链接 Problem Description Nash Equilibrium is an important concept in game theory. Rikka and Yuta are ...

  7. HDU 6377 度度熊看球赛 (计数DP)

    度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  8. hdu-6415 Rikka with Nash Equilibrium dp计数题

    http://acm.hdu.edu.cn/showproblem.php?pid=6415 题意:将1~n*m填入一个n*m矩阵 问只有一个顶点的构造方案. 顶点的定义是:某数同时是本行本列的最大值 ...

  9. 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 ...

随机推荐

  1. Charles系列一:Charles功能介绍、下载安装和界面简介

    一:Charles主要功能介绍 Charles是一个HTTP代理/HTTP监视器/反向代理,使开发和测试人员能够查看机器和Internet之间所有的HTTP和SSL/HTTPS流量,这包括请求,响应. ...

  2. 淘宝客类别id大全

    汽车/用品/配件/改装 例 [ID:26] 家居饰品 例 [ID:50020808] 特色手工艺 例 [ID:50020857] 景点门票/度假线路/旅游服务 例 [ID:50025707] 男装 例 ...

  3. hdoj3586 (树形dp)

    题目链接:https://vjudge.net/problem/HDU-3586 题意:一棵边权树,要删掉一些边使得每个叶子结点不能到达树根,且这些边的权值<=上限Max,且边权和小于m,求最小 ...

  4. msyql 主从切换

    从库是192.168.1.70 ,主库是192.168.1.64,主从切换一次 即:主库是192.168.1.70,从库是192.168.1.64 1.从库上执行,修改为主 修改从库为非只读库修改配置 ...

  5. ThreadLocal父子线程之间的数据传递问题

    一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取 ...

  6. http无状态和鉴权解决四种方案

    http协议本身是无状态的,但是在实际的web开发中常有一些操作需要有状态.比如想要访问一些私人访问权限的文章,或者这种操作需要明确当前用户身份. 显然,最简单的方案就是每次都发送账户和密码,但是这样 ...

  7. QQ浏览器、搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie、Session失效问题

    原文:QQ浏览器.搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie.Session失效问题 这些狗日的浏览器在兼容模式下,保存Cookie会失败,是因为SameSiteMode默认为La ...

  8. VS显示方法引用

    菜单栏 工具->选项->文本编辑器->所有语言->CodeLens 勾上即可

  9. phpspider爬虫框架的使用

    这几天使用PHP的爬虫框架爬取了一些数据,发现还是挺方便的,先上爬虫框架的文档 phpspider框架文档 使用方法其实在文档中写的很清楚而且在demo中也有使用示例,这里放下我自己的代码做个笔记 & ...

  10. JS笛卡尔积算法与多重数组笛卡尔积实现方法示例

    js 笛卡尔积算法的实现代码,据对象或者数组生成笛卡尔积,并介绍了一个javascript多重数组笛卡尔积的例子,以及java实现笛卡尔积的算法与实例代码. 一.javascript笛卡尔积算法代码 ...