题目描述:

有一个 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:

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)的更多相关文章

  1. CodeForces621E 快速矩阵幂优化dp

    有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...

  2. 形态形成场(矩阵乘法优化dp)

    形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...

  3. 斐波那契数列 矩阵乘法优化DP

    斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007​\),\(n\le 10^{18}​\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...

  4. [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

    题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...

  5. 矩阵乘法优化DP

    本文讲一下一些基本的矩阵优化DP的方法技巧. 定义三个矩阵A,B,C,其中行和列分别为$m\times n,n \times p,m\times p$,(其中行是从上往下数的,列是从左往右数的) $C ...

  6. ZOJ 3632 K - Watermelon Full of Water 优先队列优化DP

    K - Watermelon Full of Water Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld &am ...

  7. 【循环矩阵乘优化DP】BZOJ 2510 弱题

    题目大意 有 \(M\) 个球,一开始每个球均有一个初始标号,标号范围为 \(1\) - \(N\) 且为整数,标号为 \(i\) 的球有 \(a_i\) 个,并保证 \(\sum a_i = M\) ...

  8. 矩阵乘法优化DP复习

    前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...

  9. 【bzoj2476】战场的数目 矩阵乘法优化dp

    题目描述 (战场定义为对于最高的一列向两边都严格不增的“用积木搭成”的图形) 输入 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周 ...

随机推荐

  1. javscript踩过的坑 - 记录

    1. js中, ‘==’ 运算符是对大小写敏感的

  2. SVN目录结构

    整理了一下svn目录结构,如下: 项目名称 ----branches    软件产品的迭代开发版本 ----tags        软件产品经过完整测试的历史稳定版本,已部署在客户机器上使用的 --- ...

  3. selenium+python+pycharm环境搭建

    1.安装python,配置path环境变量,验证python安装成功与否 2.安装Pycharm:Pycharm是Python的IDE,所以我们需要安装一下:下载安装Selenium 3.在官网(ht ...

  4. Bilateral Filtering(双边滤波) for SSAO

    原网址:http://blog.csdn.net/bugrunner/article/details/7170471 1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法.这里主要简单介绍一下B ...

  5. Python2处理字符集问题

    这篇文章主要介绍了Python2.x中文乱码问题解决方法,本文解释问题原因.给出了处理办法并讲解了编码解码的一些知识,需要的朋友可以参考下 Python中乱码问题是一个很头痛的问题. 在Python3 ...

  6. 5.MPEG-4 压缩编码标准

    1.MPEG-4标准概述 与MPEG1和MPEG2标准相比,MPEG-4 更加注重多媒体系统的交互性和灵活性,主要应用于可视电话.视频会议等. MPEG-4 标准主要包含音视频对象编码工具集和编码对象 ...

  7. Elasticsearch 全字段搜索_all,query_string查询,不进行分词

    最近在使用ELasitcsearch的时候,需要用到关键字搜索,因为是全字段搜索,就需要使用_all字段的query_string进行搜索. 但是在使用的时候,遇到问题了.我们的业务并不需要分词,我在 ...

  8. 附上SQL Server的存储过程例子

    代码如下,看了就明白: --添加项目大类存储过程 use chaiqianD2 go if object_id('p_InsertBigType', 'p') is not null drop pro ...

  9. js动态的给json对象添加新的元素

    把{name:"xxx",age:"xxx"}变成{name:"xxx",age:"xxx",value:"x ...

  10. 636. Exclusive Time of Functions 进程的执行时间

    [抄题]: Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU ...