XJOI3602 邓哲也的矩阵(优先队列优化DP)
题目描述:
有一个 n×m的矩阵,现在准备对矩阵进行k次操作,每次操作可以二选一
1:
选择一行,给这一行的每一个数减去p,这种操作会得到的快乐值等于操作之前这一行的和
2:
选择一列,给这一列的每一个数减去p,这种操作会得到的快乐值等于操作之前这一列的和
那么问题来了,k次操作最大可能得到的和是多少。
输入格式:
第一行输入4个整数n,m,k,p
接下来n行,每行输入m个整数a[i][j]
输出格式:
输出最大可能的和
样例输入1:
2 2 2 2
1 3
2 4
样例输出1:
11
样例输入2:
5 5 20 100
464 757 53 708 262
753 769 189 38 796
394 60 381 384 935
882 877 501 615 464
433 798 504 301 301
样例输出2:
38013
样例输入3:
2 1 3 2
3
3
样例输出3:
8
约定:
1≤n,m≤1000,1≤k≤106,1≤p,a[i][j]≤1000
题解:
首先观察第三个样例,显然将行和列和压入优先队列搞k次是不现实的,
因为最大值应该是取第一列、第一行、第二行,答案为8,
如果按上述方法搞会取出两次第一列,一次第一或第二行,答案为7
为什么会造成这种结果?
因为每次取行的时候我们并没有想到对列的值也会产生变化,并且这种取法有后效性。
所以索性先取行后取列
枚举取一次、两次……k次行,相对应会取k-1、k-2……1次列
记dp_row[i]表示取i次行获得的最大值,这个显然可以用优先队列瞎搞
同样dp_colomn[i]表示取y次行获得的最大值,也可以用优先队列瞎搞
先取行再取列会使列的值损失,损失多少呢?
假设取i次列,k-i次行
每行损失i*p
共k-i行
共损失i*(k-i)*p
于是状态转移方程就推出来了
ans=max{ans,dp_row[i]+dp_colomn[k-i]-i*(k-i)*p}
注意这个数可能会非常小,所以ans一定要设成-1e18,不能用-0x3f3f3f3f
代码如下:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; long long a[][],sumr[],suml[],dp1[],dp2[];
int n,m,k,p; int main()
{
scanf("%d%d%d%d",&n,&m,&k,&p);
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
scanf("%lld",&a[i][j]);
}
}
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
sumr[i]+=a[i][j];
}
}
for(int i=; i<=m; i++)
{
for(int j=; j<=n; j++)
{
suml[i]+=a[j][i];
}
}
priority_queue<long long> q,q2;
for(int i=; i<=n; i++)
{
q.push(sumr[i]);
}
for(int i=; i<=k; i++)
{
long long tmp=q.top();
q.pop();
dp1[i]=dp1[i-]+tmp;
tmp-=1ll*m*p;
q.push(tmp);
}
for(int i=; i<=m; i++)
{
q2.push(suml[i]);
}
for(int i=; i<=k; i++)
{
long long tmp=q2.top();
q2.pop();
dp2[i]=dp2[i-]+tmp;
tmp-=1ll*n*p;
q2.push(tmp);
}
for(int i=; i<=k; i++)
{
dp2[i]-=1ll*i*(k-i)*p;
}
long long ans=-1e18;
for(int i=; i<=k; i++)
{
ans=max(ans,dp1[i]+dp2[k-i]);
}
printf("%lld\n",ans);
}
XJOI3602 邓哲也的矩阵(优先队列优化DP)的更多相关文章
- CodeForces621E 快速矩阵幂优化dp
有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...
- 形态形成场(矩阵乘法优化dp)
形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
- 矩阵乘法优化DP
本文讲一下一些基本的矩阵优化DP的方法技巧. 定义三个矩阵A,B,C,其中行和列分别为$m\times n,n \times p,m\times p$,(其中行是从上往下数的,列是从左往右数的) $C ...
- ZOJ 3632 K - Watermelon Full of Water 优先队列优化DP
K - Watermelon Full of Water Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%lld &am ...
- 【循环矩阵乘优化DP】BZOJ 2510 弱题
题目大意 有 \(M\) 个球,一开始每个球均有一个初始标号,标号范围为 \(1\) - \(N\) 且为整数,标号为 \(i\) 的球有 \(a_i\) 个,并保证 \(\sum a_i = M\) ...
- 矩阵乘法优化DP复习
前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...
- 【bzoj2476】战场的数目 矩阵乘法优化dp
题目描述 (战场定义为对于最高的一列向两边都严格不增的“用积木搭成”的图形) 输入 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周 ...
随机推荐
- Install MongoDB Community Edition on Ubuntu
Install MongoDB > Install MongoDB Community Edition > Install MongoDB Community Edition on Lin ...
- openLayers 3 之入门
openLayers 3 之入门 openlayer是web GIS客户端开发提供的javascript类库,也是开源框架,可以加载本地数据进行展示地图 1.下载相关引用的js.css文件 2.类似于 ...
- 利用 Django admin 完成更多任务(转)
利用 Django admin 完成更多任务 Django admin Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然 ...
- SpringMVC前后台数据传递中Json格式的相互转换(前台显示格式、Json-lib日期处理)及Spring中的WebDataBinder浅析
两个方向: 一.前台至后台: Spring可以自动封装Bean,也就是说可以前台通过SpringMVC传递过来的属性值会自动对应到对象中的属性并封装成javaBean,但是只能是基本数据类型(int, ...
- powerdesigner 数据库表定义导出到excel
shift+ctrl+X,打开脚本运行,脚本如下:'************************************************************************** ...
- Core 第三组 结对作业——四则运算 Part1. Core代码编写
结对作业——四则运算 Part1. Core代码编写 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 (因为内容较多,分为了三个部分,但作业系统中只能提交一 ...
- Spark之 SparkSql、DataFrame、DataSet介绍
SparkSql SparkSql是专门为spark设计的一个大数据仓库工具,就好比hive是专门为hadoop设计的一个大数据仓库工具一样. 特性: .易整合 可以将sql查询与spark应用程序进 ...
- 第五章 大数据平台与技术第11讲 MapReduce编程
在大规模的数据当中,需要分发任务,需要进行分布式的并行编程.Hadoop这样一种开源的大数据分析平台. Map阶段 Reduce阶段:相同的键把它聚集到一起之后,然后通过Reduce方式把相同的键聚集 ...
- 92. Reverse Linked List II (List)
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1-> ...
- leetcode array解题思路
Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...