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),表示战场的图形周 ...
随机推荐
- Julia - 复合表达式
复合表达式是用一个表达式按照顺序对一系列子表达式求值,并返回最后一个子表达式的值 有两种方法:begin 块和 “;” 链 begin 块 begin 块的多行写法 julia> a = beg ...
- 如何利用R包qqman画曼哈顿图?
如何利用R包qqman画曼哈顿图? 2017-07-10 lili 生信人 众多周知,R语言提供了各种各样的包,方便实现我们的目的,下面给大家介绍一个可以便捷的画曼哈顿图的包:qqman instal ...
- python开发_python中的函数定义
下面是我做的几个用列: #python中的函数定义,使用和传参 def_str = '''\ python中的函数以如下形式声明: def 函数名称([参数1,参数2,参数3......]): 执行语 ...
- mysql 里的 ibdata1 文件不断的增长?
我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题.当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了.一番调查 ...
- jbpm角色审批
可分配是一个部门或角色组,也可以选择一个表达式操作,提交任务时可以根据权限过滤这个部门或组的用户中选择一个可操作用户 <task name="审核"> ...
- 深入探究jvm之GC的算法及种类
一.GC基本概念 GC(Garbage Collection)垃圾收集,1960年最早在List中使用.在Java中GC回收的对象是堆空间和永久区,可以有效避免程序员人为造成内存泄漏问题.将堆空间和永 ...
- spring 采用编程式事务
1.getCurrentSession()与openSession()的区别? * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession() ...
- linux下jdk/maven/tomcat
debian安装的openjdk只包括jre,没有tools.jar,dt.jar,所以要安装openjdk完全版. sudo apt--jdk 若操作系统中安装多个版本的java,可以采用如下命令来 ...
- Spark scala和java的api使用
1.利用scala语言开发spark的worcount程序(本地运行) package com.zy.spark import org.apache.spark.rdd.RDD import org. ...
- C#给图片加文字和图片的水印
/// <summary> /// WaterMark 的摘要说明 /// </summary> /// 图片加水印 /// <param name="strC ...