【CZY选讲·最大子矩阵和】
题目描述
有一个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选讲·最大子矩阵和】的更多相关文章
- 【CZY选讲·Hja的棋盘】
题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...
- 【CZY选讲·吃东西】
题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...
- 【CZY选讲·一道图论神题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...
- 【CZY选讲·Yjq的棺材】
题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...
- 【CZY选讲·逆序对】
题目描述 LYK最近在研究逆序对. 这个问题是这样的. 一开始LYK有一个2^n长度的数组ai. LYK有Q次操作,每次操作都有一个参数k.表示每连续2^k长度作为一个小组.假设 n=4,k= ...
- 【CZY选讲·Triangle】
题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解: ①相 ...
- 【CZY选讲·棋盘迷宫】
题目描述 一个N*M的棋盘,’.’表示可以通过,’#’表示不能通过,给出Q个询问,给定起点和终点,判断两点是否联通,如联通输出“Yes”,否则输出“No”. 数据范围 N,M <=500,Q ...
- 【CZY选讲·扩展LCS】
题目描述 给出两个仅有小写字母组成的字符串str1 和str2,试求出两个串的最长公共子序列. 数据范围 |str1| ⩽ 1000; |str2| ⩽ 10^6 题解: ①直接进行LCS( ...
- 【CZY选讲·次大公因数】
题目描述 给定n个数ai,求sgcd(a1,a1),sgcd(a1,a2),…,sgcd(a1,an). 其中sgcd(x,y)表示x和y的次大公因数.若不存在次大公因数,sgcd(x,y)=-1 ...
随机推荐
- SpringMVC使用ModelAndView的相对路径和绝对路径的问题
例如:abc/a/a.jsp,想要跳转到根目录的b.jsp 使用 ModelAndView 跳转, 若引用:org.springframework.web.portlet.ModelAndView 这 ...
- python基础数据类型之字典的操作
一. 字典的简单介绍字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中key是唯一的. 在保存的时候, 根据key来计算出一个内存地址. 然后将key- ...
- Nginx无法加载.woff .eot .svg .ttf等解决办法
在Nginx的配置文件,加上以下代码即可修复该问题 location ~ \.(eot|otf|ttf|woff|svg)$ { add_header Access-Control-Allow-Ori ...
- thinkphp5控制器向+vue的data里传值
传一维数组传值 $array=['id'=>40,"cat_name"=>"明星产品"]; $MenuCats_info=json_encode($ ...
- Java基础——对象和类
将包含main方法的类称为主类. 变量的作用域是指变量可以在程序中引用的范围. 实例变量和静态变量的作用域是整个类,无论变量是在哪里声明的. 局部变量的声明和使用都在一个方法的内部. 一个类的实例变量 ...
- C# 控件置于最顶层、最底层、隐藏、显示
控件置于最顶层.最底层 pictureBox1.BringToFront();//将控件放置所有控件最前端 pictureBox1.SendToBack();//将控件放置所有控件最底端 控件隐藏.显 ...
- POJ:2385-Apple Catching(dp经典题)
Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14311 Accepted: 7000 Descr ...
- 20,Django contenttypes 应用
contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 1.创建一个项目 2.数据库迁移,生成默认表. 3.存着所 ...
- Android 支付宝H5 没有回调
今天测试反馈问题,说,手机上没有安装支付宝的,调用支付宝支付之后,没有回调.不提示成功也不提示失败. 我自己试了半天也都是没有问题 .后来终于可以试出来了. 发现原来是,清单里面注册的Activity ...
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目7
2014-03-18 01:55 题目:给定一个MxN矩阵,如果某个元素为0,则将对应的整行和整列置为0. 解法:单独挑出一行和一列作为标记数组.因为某元素为0就全部置为0,所以不论A[i][j]为0 ...