【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
我只想朝着远方边走边唱,歌唱这生命美丽和迷惘。————汪峰《边走边唱》
转载于:https://www.cnblogs.com/Damitu/p/7654800.html
【CZY选讲·最大子矩阵和】相关推荐
- 【CZY选讲·吃东西】
题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...
- 【CZY选讲·Yjq的棺材】
题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...
- 【CZY选讲·Triangle】
题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解: ①相 ...
- 动态规划选讲 8.15
动态规划选讲 8.15 动态规划选讲 815 地精部落SDOI 2010 打砖块 另一个打砖块 TreePOJ 1848 Painting the ballsSGU183 CF 611D 洪水概率DP ...
- UA CSC696H 强化学习理论选讲1 强化学习概览
UA CSC696H 强化学习理论选讲1 强化学习概览 强化学习相关概念 Markov Decision Processes(MDP)简介 Policy Evaluation 强化学习(reinfor ...
- 练习图200例图纸讲解_【宅家数学课23】经典微课6:苏教版六年级下册比例尺典型例题选讲及练习(含答案)...
(截止日期:3月31日) 学习过程 1.点击观看经典微课: 微课视频 <比例尺> 2.认真学习典型例题,完成下方练习题 3.查看答案,在家长指导下批改,订正错误. 苏教版小学数学六年级下册 ...
- C++11新特性选讲 语言部分 侯捷
C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...
- 20190509杂题选讲
这次杂题选讲好多思维题神仙题啊= =顺便学了波线段树上二分= = Normal 题目大意戳这 CF1083C CDW讲的神仙题*1 题解戳这 AGC002E 我讲的题,是个人写的程序都比我写的程序跑得 ...
- PJ可能会用到的动态规划选讲-学习笔记
PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...
最新文章
- Linux下查看MySQL的安装路径
- echart实现3d地图_3D飞线效果——让线“飞”起来的秘密
- 一:MyBatis知识整理(1)
- python无法调用安装的包_无法在Windows 10上使用python2.7/MINGW安装pyslalib软件包
- Poj 1166 The Clocks(bfs)
- c++ 建立MFC应用程序
- Wi-Fi 无线网二维码生成 API 接口
- go语言和c运行效率,Go语言执行效率
- 豫教科计算机资源管理教案,豫科版小学五年级上册信息技术教案(全册.doc
- 网页贴便签, Chrome特色网页便签纸 OurStickys
- 关于const A* f(const A* pSrc,A* const pDst,int v=2,...) const throw();
- 兼容IE8的文件下载,解决IE下载文本和图片直接打开问题
- 常见锐捷光模块型号大全
- 数据库课程设计-员工信息管理系统(基于python和MySQL实现)
- arduino蓝牙linux,Arduino Tian 开发板 Arduino yun升级 wifi 蓝牙 Linux限量
- SQLite安装配置详细教程2023版
- 会话劫持攻击实战与防范
- 12306 验证图片模式网摘思路
- CG100一汽威志防盗
- java日历程序设计
热门文章
- 威斯康星麦迪逊计算机科学专业,威斯康星大学麦迪逊分校计算机科学专业申请条件汇总...
- 是非人生 — 一个菜鸟程序员的5年职场路 第8节
- CREATE TABLESPACE命令详解
- 现有大语言模型(ChatGPT)的上下文理解能力还是假象吗?
- 算法:最小公倍数的求解方法
- 拼多多,京东,1688一键铺货到淘宝
- 怎样用c语言写高速超速罚款标准,如何做到科一满分一把过?超速扣分题必须掌握!...
- linux proftpd 关闭匿名用户,Linux ProFTPd安装与卸载详细介绍_Linux_脚本之家
- 揭秘 手机群控 带来的利益
- idea中java程序打jar包的两种方式(超详细)