题目描述

有一个n*m的矩阵,恰好改变其中一个数变成给定的常数P,使得改变后的这个矩阵的最大子矩阵最大。

数据范围

n,m<=300。

题解:

   ①如果没有p,那么二维矩阵和就是一维最长连续子序列的DP升级就可以了:

     设f[i][j][k]表示在i行j行之间1~k列这一个矩形中的最大子矩阵的值

     转移方程:f[i][j][k]=max(f[i][j][k-1]+sum[k],sum[k])

     其中sum[k]表示(i,k)-(j,k)这一段一维序列的元素和。

     上述在代码实现的时候可以压维,即覆盖以前的答案。

     

   ②根据题意,加一维[1/0]表示到目前为止最优矩阵中有没有点被更改了:
       然后转移同理,只是如果选择修改,肯定是修改最小的数,所以使用RMQ或者暴力得出即可

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
const double eps = 1e-6;
const double Pi = acos(-1.0);
const int INF=0x3f3f3f3f; const int maxn = 310;
int mat[maxn][maxn];
int minval[maxn];
int sum[maxn];
int dp[maxn][2]; int dp1(int* sum,int m,int p){
int ret = -INF;
for(int i = 0; i < m; i++){
int minn = INF;
int summ = 0;
for(int j = i; j < m; j++){
summ += sum[j];
minn = min(minn,minval[j]);
if(i == 0 && j == m-1){
ret = max(ret,summ - minn + p);
}else{
int maxx = max(summ,summ - minn + p);
ret = max(maxx,ret);
}
}
}
return ret; } int dp2(int* sum,int m,int p){
dp[0][0] = sum[0];
dp[0][1] = sum[0] - minval[0] +p;
for(int i = 1; i < m; i++){
dp[i][0] = max(dp[i-1][0],0)+sum[i];
dp[i][1] = max(dp[i-1][1] + sum[i],max(dp[i-1][0],0) + sum[i] - minval[i] + p);
}
int ret = -INF;
for(int i = 0; i < m; i++){
ret = max(ret,max(dp[i][0],dp[i][1]));
}
return ret;
} int solve(int n,int m,int p){
int ans = -INF;
for(int i = 0; i < n; i++){
fill(sum,sum+m+1,0);
fill(minval,minval+m+1,INF);
for(int j = i; j < n; j++){
for(int k = 0; k < m; k++){
sum[k] += mat[j][k];
minval[k] = min(minval[k],mat[j][k]);
}
if(i == 0 && j == n-1){
ans = max(ans,dp1(sum,m,p));
}else{
ans = max(ans,dp2(sum,m,p));
}
}
}
return ans;
} int main(){
int n,m,p;
while(~scanf("%d%d%d",&n,&m,&p)){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
scanf("%d",&mat[i][j]);
}
}
printf("%d\n",solve(n,m,p));
}
return 0;
}//czy020202

我只想朝着远方边走边唱,歌唱这生命美丽和迷惘。————汪峰《边走边唱》

【CZY选讲·最大子矩阵和】的更多相关文章

  1. 【CZY选讲·Hja的棋盘】

    题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...

  2. 【CZY选讲·吃东西】

    题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...

  3. 【CZY选讲·一道图论神题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...

  4. 【CZY选讲·Yjq的棺材】

    题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...

  5. 【CZY选讲·逆序对】

    题目描述 LYK最近在研究逆序对. 这个问题是这样的. 一开始LYK有一个2^n长度的数组ai. LYK有Q次操作,每次操作都有一个参数k.表示每连续2^k长度作为一个小组.假设 n=4,k= ...

  6. 【CZY选讲·Triangle】

    题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解:      ①相 ...

  7. 【CZY选讲·棋盘迷宫】

    题目描述 一个N*M的棋盘,’.’表示可以通过,’#’表示不能通过,给出Q个询问,给定起点和终点,判断两点是否联通,如联通输出“Yes”,否则输出“No”. 数据范围 N,M <=500,Q ...

  8. 【CZY选讲·扩展LCS】

    题目描述 给出两个仅有小写字母组成的字符串str1 和str2,试求出两个串的最长公共子序列. 数据范围 |str1| ⩽ 1000; |str2| ⩽ 10^6 题解:    ①直接进行LCS( ...

  9. 【CZY选讲·次大公因数】

    题目描述 给定n个数ai,求sgcd(a1,a1),sgcd(a1,a2),…,sgcd(a1,an). 其中sgcd(x,y)表示x和y的次大公因数.若不存在次大公因数,sgcd(x,y)=-1 ...

随机推荐

  1. Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式

    ### 1. Spring IoC IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java ...

  2. 网页更换主题以及绘制图形js代码实现

    HTML代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  3. 网页弹出[Object HTMLDivElement],怎么取值?

    使用innerHTML方法,可以得到文本值

  4. JavaSE 第二次学习随笔(一)

    Java是一种区分大小写的强类型准动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化,类型的检查是在运行时做的,优点为方便阅读,清晰明了,缺点 ...

  5. MAC下MySQL初始密码忘记修改初始密码

    解决MAC下MySQL忘记初始密码的方法分享给大家,供大家参考,具体内容如下 第一步: 点击系统偏好设置->最下边点MySQL,在弹出页面中,点击stop MySQL Servier,输入密码关 ...

  6. iOS常用控件-UITableViewCell

    一. 封装cell: 1.加载xib文件的两种方式 <方式1> (NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] ...

  7. 裸机——iNand

    1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...

  8. 使用postMan测试insert或者update接口

    URL : http://localhost:8099/orderVoice/updateAgentLogin?access_token=7f10e803-f886-47df-b3dc-9ed307d ...

  9. [BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)

    Description 题目链接 Solution 可以根据条件构造出一个矩阵, 1 3 9 27 81... 2 6 18.... 4 12 36... 这个矩阵满足\(G[i][1]=G[i-1] ...

  10. 13-在Core Mvc中使用Options

    配制文件appsettings和Classes来自12节 在HomeController增加如下代码,使用IOption方式进行注入 public class HomeController : Con ...