题目描述

有一个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选讲·最大子矩阵和】相关推荐

  1. 【CZY选讲·吃东西】

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

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

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

  3. 【CZY选讲·Triangle】

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

  4. 动态规划选讲 8.15

    动态规划选讲 8.15 动态规划选讲 815 地精部落SDOI 2010 打砖块 另一个打砖块 TreePOJ 1848 Painting the ballsSGU183 CF 611D 洪水概率DP ...

  5. UA CSC696H 强化学习理论选讲1 强化学习概览

    UA CSC696H 强化学习理论选讲1 强化学习概览 强化学习相关概念 Markov Decision Processes(MDP)简介 Policy Evaluation 强化学习(reinfor ...

  6. 练习图200例图纸讲解_【宅家数学课23】经典微课6:苏教版六年级下册比例尺典型例题选讲及练习(含答案)...

    (截止日期:3月31日) 学习过程 1.点击观看经典微课: 微课视频 <比例尺> 2.认真学习典型例题,完成下方练习题 3.查看答案,在家长指导下批改,订正错误. 苏教版小学数学六年级下册 ...

  7. C++11新特性选讲 语言部分 侯捷

    C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...

  8. 20190509杂题选讲

    这次杂题选讲好多思维题神仙题啊= =顺便学了波线段树上二分= = Normal 题目大意戳这 CF1083C CDW讲的神仙题*1 题解戳这 AGC002E 我讲的题,是个人写的程序都比我写的程序跑得 ...

  9. PJ可能会用到的动态规划选讲-学习笔记

    PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...

最新文章

  1. Linux下查看MySQL的安装路径
  2. echart实现3d地图_3D飞线效果——让线“飞”起来的秘密
  3. 一:MyBatis知识整理(1)
  4. python无法调用安装的包_无法在Windows 10上使用python2.7/MINGW安装pyslalib软件包
  5. Poj 1166 The Clocks(bfs)
  6. c++ 建立MFC应用程序
  7. Wi-Fi 无线网二维码生成 API 接口
  8. go语言和c运行效率,Go语言执行效率
  9. 豫教科计算机资源管理教案,豫科版小学五年级上册信息技术教案(全册.doc
  10. 网页贴便签, Chrome特色网页便签纸 OurStickys
  11. 关于const A* f(const A* pSrc,A* const pDst,int v=2,...) const throw();
  12. 兼容IE8的文件下载,解决IE下载文本和图片直接打开问题
  13. 常见锐捷光模块型号大全
  14. 数据库课程设计-员工信息管理系统(基于python和MySQL实现)
  15. arduino蓝牙linux,Arduino Tian 开发板 Arduino yun升级 wifi 蓝牙 Linux限量
  16. SQLite安装配置详细教程2023版
  17. 会话劫持攻击实战与防范
  18. 12306 验证图片模式网摘思路
  19. CG100一汽威志防盗
  20. java日历程序设计

热门文章

  1. 威斯康星麦迪逊计算机科学专业,威斯康星大学麦迪逊分校计算机科学专业申请条件汇总...
  2. 是非人生 — 一个菜鸟程序员的5年职场路 第8节
  3. CREATE TABLESPACE命令详解
  4. 现有大语言模型(ChatGPT)的上下文理解能力还是假象吗?
  5. 算法:最小公倍数的求解方法
  6. 拼多多,京东,1688一键铺货到淘宝
  7. 怎样用c语言写高速超速罚款标准,如何做到科一满分一把过?超速扣分题必须掌握!...
  8. linux proftpd 关闭匿名用户,Linux ProFTPd安装与卸载详细介绍_Linux_脚本之家
  9. 揭秘 手机群控 带来的利益
  10. idea中java程序打jar包的两种方式(超详细)