题目链接:(vjudge)戳我

从今天开始不咕咕地填坑啦

考虑一般的求最大子矩阵和。。。我们一般都是DP,或者直接上悬线法递推。

下面附一个DP的代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAXN 310
using namespace std;
int n,m,p,all,ans;
int a[MAXN][MAXN],dp[MAXN],minn[MAXN],sum[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
memset(minn,0x3f,sizeof(minn));
all=0,ans=-2147483647;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]),all+=a[i][j];
for(int l=1;l<=n;l++)
{
memset(sum,0,sizeof(sum));
for(int r=l;r<=n;r++)
{
for(int i=1;i<=m;i++)
{
sum[i]+=a[r][i];
if(l==r) minn[i]=a[r][i];
else minn[i]=min(minn[i],a[r][i]);
if(i==1) dp[i]=sum[i];
else dp[i]=max(sum[i],dp[i-1]+sum[i]);
ans=max(ans,dp[i]);
}
}
}
printf("%d\n",ans);
}
return 0;
}

然后这个题就是最大子矩阵和的变形。要求必须修改一个。

我们新开一个数组dp2[i]来记录第一维在\([l,r]\)范围内(这个做右端点是需要\(n^2\)枚举的),第二维计算到i的时候,修改了一个位置为p的最大子矩阵和。

因为要修改之后尽量大,所以我们转移的时候需要维护当前\(i\)这一列最小的矩形中最小的元素,那么带修改的自然就是减去这个最小值然后加上p了。

转移最大子矩形和的时候注意分类讨论,分一类为继承前一列,一类为自己新开一个。带修改的还需要分类讨论如果继承前一列,那个带修改的位置到底是在自己这一列还是在前面列中。

然后还有一点就是因为我们修改的这个位置不一定被选入到我们的最大子矩阵和的矩阵里,所以每个不修改的状态也要记录一遍。(当然要特判一下,所有数取满是非法情况要排除掉啦!)

然后每种情况都和ans取一个最大值。

具体看代码吧。代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAXN 310
using namespace std;
int n,m,p,all,ans;
int a[MAXN][MAXN],dp1[MAXN],dp2[MAXN],minn[MAXN],sum[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
memset(a,0,sizeof(a));
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
memset(minn,0x3f,sizeof(minn));
all=0,ans=-2147483647;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]),all+=a[i][j];
for(int l=1;l<=n;l++)
{
memset(sum,0,sizeof(sum));
for(int r=l;r<=n;r++)
{
for(int i=1;i<=m;i++)
{
sum[i]+=a[r][i];
if(l==r) minn[i]=a[r][i];
else minn[i]=min(minn[i],a[r][i]);
if(i==1) dp1[i]=sum[i];
else dp1[i]=max(sum[i],dp1[i-1]+sum[i]);
if(i==1) dp2[i]=sum[i]-minn[i]+p;
else dp2[i]=max(dp2[i-1]+sum[i],max(dp1[i-1]+sum[i]-minn[i]+p,sum[i]-minn[i]+p));
if(dp1[i]!=all)
ans=max(ans,dp1[i]);
ans=max(ans,dp2[i]);
printf("l=%d r=%d i=%d ans=%d\n",l,r,i,ans);
}
}
}
printf("%d\n",ans);
}
return 0;
}

hihocoder1580 Matrix的更多相关文章

  1. angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation

    今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:

  2. Pramp mock interview (4th practice): Matrix Spiral Print

    March 16, 2016 Problem statement:Given a 2D array (matrix) named M, print all items of M in a spiral ...

  3. Atitit Data Matrix dm码的原理与特点

    Atitit Data Matrix dm码的原理与特点 Datamatrix原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于 ...

  4. Android笔记——Matrix

    转自:http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#translate Matrix的数学原理 在Android中,如果你 ...

  5. 通过Matrix进行二维图形仿射变换

    Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的"平直性"和"平行性".仿射变换可以通过一系列的原子变换的复合来 ...

  6. [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  7. [LeetCode] Longest Increasing Path in a Matrix 矩阵中的最长递增路径

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

  8. [LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  9. [LeetCode] Search a 2D Matrix 搜索一个二维矩阵

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

随机推荐

  1. Struts2结果页面配置(Result)

    1.全局页面配置 全局结果页面:针对一个包下的所有Action的页面跳转都可生效 <global-results> <result name="xxx">/ ...

  2. Python修饰器讲解

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 文章先由stackoverflow上面的一个问题引起吧,如果使 ...

  3. Dreamweaver基本操作

    1.站点管理 在网站设计前,我们需要先建立站点,再进行网站设计. 站点 作用:用来归纳一个网站上所有的网页.素材及他们之间的联系. 站点根文件夹命名规则:由数字.字母.下划线组成,数字不能在开头. 首 ...

  4. Proxmox VE 设置备忘

    现在PROXMOX 虚拟机一共两个(使用的是N3700 cpu的一个小机器主要为了省电.) 一个是ROS,经过折腾,IK8速度还不错就是资源占用比较大特比下载数据大时对CPU占用很大:OpenWRT不 ...

  5. java 蓝桥杯算法提高 矩阵乘法

    思路:根据提示的内容,我们可以得到c[i][j] += a[i][k]*b[k][j],k>=0&&k<s PS:这道题本身不难,但是当我定义A[m][s] B[s][n] ...

  6. MenuItem属性

    [MenuItem属性] The MenuItem attribute allows you to add menu items to the main menu. The MenuItem attr ...

  7. CloudStack 初始化执行命令流分析

                查询路由元素   选择可以使用的路由元素   需要将网络服务提供者的:虚拟路由和安全同时启用   { "createnetworkresponse" : { ...

  8. 手把手教你看KEGG通路图!

    手把手教你看KEGG通路图! 亲爱的小伙伴们,是不是正关注代谢通路研究?或者你正面对数据,绞尽脑汁?小编当然不能让亲们这么辛苦,今天就跟大家分享KEGG代谢通路图的正确解读方法,还在迷糊中的小伙伴赶紧 ...

  9. Logback configuration

    官方指导 http://logback.qos.ch/manual/configuration.html 规则 ch.qos.logback.core.joran.JoranConfiguratorB ...

  10. PreparedStatementSQLException

    目录 文章背景 目录 问题分析 问题解决 说明 参考文章 版本记录 layout: default title: PreparedStatementSQLException category: [Te ...