#1580 : Matrix

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

描述

Once upon a time, there was a little dog YK. One day, he went to an antique shop and was impressed by a beautiful picture. YK loved it very much.

However, YK did not have money to buy it. He begged the shopkeeper whether he could have it without spending money.

Fortunately, the shopkeeper enjoyed puzzle game. So he drew a n × m matrix on the paper with integer value ai,j in each cell. He wanted to find 4 numbers x, y, x2, and y2(x ≤ x2, y ≤ y2), so that the sum of values in the sub-matrix from (x, y) to (x2, y2) would be the largest.

To make it more interesting, the shopkeeper ordered YK to change exactly one cell's value into P, then to solve the puzzle game. (That means, YK must change one cell's value into P.)

If YK could come up with the correct answer, the shopkeeper would give the picture to YK as a prize.

YK needed your help to find the maximum sum among all possible choices.

输入

There are multiple test cases.

The first line of each case contains three integers n, m and P. (1 ≤ n, m ≤ 300, -1000 ≤ P ≤ 1000).

Then next n lines, each line contains m integers, which means ai,j (-1000 ≤ ai,j ≤ 1000).

输出

For each test, you should output the maximum sum.

样例输入

3 3 4
-100 4 4
4 -10 4
4 4 4
3 3 -1
-2 -2 -2
-2 -2 -2
-2 -2 -2
样例输出
24
-1

题意:

给一个n*m的矩阵和一个数P,你可以将矩阵中的某个值修改成P(必须且只能修改一次),求最大子矩阵

sum[x][a][b][0]表示第x行第a列到第b列的所有数之和,中间没有数被修改

sum[x][a][b][1]表示第x行第a列到第b列的所有数之和,中间最小的那个数被修改成P

dp[x][a][b][0]表示子矩阵的最左边是第a列,最右边是第b列,最下边是第x行的最大取值,中间没有数被修改

dp[x][a][b][1]表示子矩阵的最左边是第a列,最右边是第b列,最下边是第x行的最大取值,中间一定有一个数被修改

注意:

①直接dp会超时超内存,其中dp数组很显然可以降为1维,这样就可以AC了;理论上sum[]也可以降为1维,但是比较麻烦,可以不用

②还有因为必须修改一个,所以整个矩阵不能在不修改的情况下全选!这个地方要特判,可以暴力,具体看程序

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct
{int x;int y;
}Res;
Res sum[302][302][302], dp[302];
int a[302][302];
int Read()
{int x = 0, f = 1;char ch;ch = getchar();while(ch<'0' || ch>'9'){if(ch=='-')  f = -1;ch = getchar();}while(ch>='0' && ch<='9')x = x*10+ch-'0', ch = getchar();return x*f;
}
int main(void)
{int n, m, i, j, k, now, p, ans, sy, sx;while(scanf("%d%d%d", &n, &m, &p)!=EOF){for(i=1;i<=n;i++){for(j=1;j<=m;j++)a[i][j] = Read();}for(i=1;i<=n;i++){for(j=1;j<=m;j++){now = a[i][j];for(k=j;k<=m;k++){now = min(now, a[i][k]);sum[i][j][k].x = sum[i][j][k-1].x+a[i][k];sum[i][j][k].y = sum[i][j][k].x-now+p;}}}ans = p;for(j=1;j<=m;j++){for(k=j;k<=m;k++){dp[1].x = sum[1][j][k].x;dp[1].y = sum[1][j][k].y;if(j==1 && k==m)ans = max(ans, dp[1].y);elseans = max(ans, max(dp[1].y, dp[1].x));for(i=2;i<=n;i++){sx = sum[i][j][k].x;sy = sum[i][j][k].y;dp[i].x = max(0, dp[i-1].x)+sx;dp[i].y = max(sy, max(dp[i-1].x+sy, dp[i-1].y+sx));if(j==1 && k==m)ans = max(ans, dp[i].y);elseans = max(ans, max(dp[i].y, dp[i].x));}}}for(i=1;i<=n;i++){now = 0;for(j=i;j<=n;j++){now += sum[j][1][m].x;if(i==1 && j==n)continue;ans = max(ans, now);}}printf("%d\n", ans);}return 0;
}

2017 ACM-ICPC北京网络赛: C. Matrix(DP)相关推荐

  1. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  2. 2016 ICPC 北京网络赛 A 恶心模拟 F 循环矩阵,FFT(待补) I 模拟

    2016 ICPC 北京网络赛 A - The Book List 题意:每本书有所属种类,给出原生的存放方式,求按新的方式存放的样子. tags:坑到心态爆炸的题==  直接堆进vector里搞的, ...

  3. 2011 ACM/ICPC 北京现场赛 B HouYi's secret

    周日起床后看见QQ群消息说 bupt上有半同步北京现场赛试题,就进入看了下题,一共读了两个题 A和B(因为这两个题目当时就都提交的很多) A题不会做,有限制的生成树的这类知识好像还没有接触过... B ...

  4. 2017 ACM/ICPC 北京赛区小结 By jsb @Reconquista

    Statistics TYPE: Onsite Contest NAME: 2017 - ICPC - Asia Beijing PLAT: hihoCoder TIME: 2017/11/19 09 ...

  5. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  6. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

  7. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  8. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  9. 2018 icpc北京网络赛C cheat 模拟

    这题就是一个模拟.比赛时候还有三个多小时,当时也没有开别的题,终于等到了模拟.(本弱鸡模拟选手终于有时间写模拟了). 反正写模拟最主要的就是要自己思路清晰,写之前我自己开了一个txt,吧每个人的游戏策 ...

最新文章

  1. 一键将Word转换为MarkDown
  2. asp.net后台代码动态添加JS文件和css文件的引用
  3. 编写一个算法frequency,统计在一个输入字符串中各个不同字符出现的频度。用适当的测试数据来验证这个算法。
  4. windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes 解决方案
  5. ASP.NET身份验证机制membership入门——配置篇(1){转}
  6. 键盘录入学生信息,保存到集合中
  7. 外伤导致色觉异常型复视(球后视神经炎+视神经萎缩)
  8. 使用java程序对新浪微博的内容进行语义分析
  9. 分享程序员提升自身能力的7个实用网站
  10. 【转】BASE64编码规则
  11. matlab怎么求hadamard,hadamard matlab
  12. PHPCMS修改目录
  13. java-web乱码问题解决
  14. 常用linux解压命令(原创)
  15. 硬件基础之模电数电电路(一)
  16. 《分布式机器学习:算法、理论与实践》
  17. 计算机机房设备使用管理,机房设备使用管理制度
  18. 华为路由器配置静态路由默认路由
  19. 马化腾绝地逢生:山重水复疑无路,柳暗花明又一村
  20. MyBatis 极速入门

热门文章

  1. python自动化办公入门书籍-用Python自动办公,做职场高手 | 「讲文兄博客」
  2. python可以自学编程吗-编程学习第一步,让你20天搞定Python编程
  3. python界面-Python GUI 编程(Tkinter)
  4. Axure的一些入门小案例
  5. Node-require的加载机制
  6. qmenu qt 关闭,Qt实现点击菜单项后QMenu不关闭功能
  7. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
  8. 镜头分割:像素域方法综述
  9. H.264 视频质量评价方法 (基于视频内容)
  10. ubuntu16.04安装python.h_ubuntu16.04安装python3.6踩过的坑