见题:

很水的一题,数据范围太小,前缀和加爆搜就行.

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int ans=,m,n,sum[maxn][maxn];
inline int read()
{
int x=,ff=;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') ff=-;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return x*ff;
}
inline void put(int x)
{
if(x<) putchar('-'),x=-x;
if(x>) put(x/);
putchar(x%+'');
}
int main()
{
//freopen("1.in","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
int x=read();
sum[i][j]=sum[i-][j]+sum[i][j-]-sum[i-][j-]+x;
}
}
for(int len=;len<=min(n,m);len++)
{
int he=len*len;
for(int x1=;x1<=n-len+;x1++)
{
for(int y1=;y1<=m-len+;y1++)
{
int x2=x1+len-;
int y2=y1+len-;
if((sum[x2][y2]-sum[x1-][y2]-sum[x2][y1-]+sum[x1-][y1-])==he) ans=len;
}
}
}
put(ans);
return ;
}

可是还是想写正解,DP;

对于这类的二维DP,个人理解就是如果保存的从起点到终点的状态会被一些情况所中断,就要只考虑最下角的点所保存的点的状态,例如此题,我们可以保存以(i,j)为右下角的状态,以f[i][j]保存以(i,j)为最右下角的最大正方形边长.状态转移怎么样呢?

这是我们我们可以轻易的想起二维的前缀和:f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j],那这个能否用前缀和处理呢,见下图:

最右下的小矩阵代表(i,j)可以很清楚地看出由左边的点,上边的点,左上角的点三个点的最小矩阵构成以个完整的矩阵,即:if(a[i][j]==1) f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;

这也提醒我们min的意义就是几个状态都具备的共同元素.

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int m,n,a[maxn][maxn],f[maxn][maxn],ans;
inline int read()
{
int x=,ff=;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') ff=-;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return x*ff;
}
int put(int x)
{
if(x<) putchar('-'),x=-x;
if(x>) put(x/);
putchar(x%+'');
}
inline void DP()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(a[i][j]==) f[i][j]=min(f[i-][j-],min(f[i-][j],f[i][j-]))+;
ans=max(ans,f[i][j]);
}
}
}
int main()
{
freopen("1.in","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++) a[i][j]=read();
}
DP();
put(ans);
return ;
}

下一题:

这一题就不能用暴力了,(n<=2600,m<=2600)只能想正解,和上一题一样我们可以用f[i][j]一(i,j)保存合法的吃到的最大的鱼的个数.

接下来就考虑状态怎么转移,我自己也是嗑了许多时间还没做出来,于是就看了题解...

给出代码:

#include<bits/stdc++.h>
using namespace std;
#define _ 0
const int maxn=;
int m,n,a[maxn][maxn],f[maxn][maxn],s1[maxn][maxn],s2[maxn][maxn],ans;
inline int read()
{
int x=,ff=;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') ff=-;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return x*ff;
}
inline void put(int x)
{
if(x<) putchar('-'),x=-x;
if(x>) put(x/);
putchar(x%+'');
}
int main()
{
freopen("1.in","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++) a[i][j]=read();
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!a[i][j])
{
s1[i][j]=s1[i][j-]+;
s2[i][j]=s2[i-][j]+;
}
if(a[i][j])
{
f[i][j]=min(f[i-][j-],min(s1[i][j-],s2[i-][j]))+;
ans=max(ans,f[i][j]);
}
}
}
memset(f,,sizeof(f));
memset(s1,,sizeof(s1));
memset(s2,,sizeof(s2));
for(int i=;i<=n;i++)
{
for(int j=m;j>=;j--)
{
if(!a[i][j])
{
s1[i][j]=s1[i][j+]+;
s2[i][j]=s2[i-][j]+;
}
if(a[i][j])
{
f[i][j]=min(f[i-][j+],min(s1[i][j+],s2[i-][j]))+;
ans=max(ans,f[i][j]);
}
}
}
put(ans);
return (^_^);
}

启示我们可以直接从最优解的转移推状态转移方程...

最大矩阵(简单DP)的更多相关文章

  1. Codeforces 41D Pawn 简单dp

    题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...

  2. 矩阵优化dp

    链接:https://www.luogu.org/problemnew/show/P1939 题解: 矩阵优化dp模板题 搞清楚矩阵是怎么乘的构造一下矩阵就很简单了 代码: #include < ...

  3. [六省联考2017]组合数问题 (矩阵优化$dp$)

    题目链接 Solution 矩阵优化 \(dp\). 题中给出的式子的意思就是: 求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数. 考虑朴素 \(dp\) ,定义状态 \(f[i][ ...

  4. [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)

    题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...

  5. hdu2067 简单dp或者记忆化搜索

    题意: 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  6. HDU 1087 简单dp,求递增子序列使和最大

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. C#的winform矩阵简单运算

    C#的winform矩阵简单运算 程序截图 关键代码 using System; using System.Collections.Generic; using System.ComponentMod ...

  8. Codeforces Round #260 (Div. 1) A. Boredom (简单dp)

    题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...

  9. codeforces Gym 100500H A. Potion of Immortality 简单DP

    Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...

  10. 简单dp --- HDU1248寒冰王座

    题目链接 这道题也是简单dp里面的一种经典类型,递推式就是dp[i] = min(dp[i-150], dp[i-200], dp[i-350]) 代码如下: #include<iostream ...

随机推荐

  1. ActiveMQ (一) 简介

    1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到“感谢那您的订单” 页面.不仅如此,若果没有延 ...

  2. 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)

    知乎链接:https://zhuanlan.zhihu.com/p/57354304 1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可 ...

  3. web.py模块使用

    web.py模块 import time import web urls=("/",'hello') class hello(): def GET(self): return (t ...

  4. 视频外同步信号研究---fvh

    视频外同步信号研究---fvh 一个时钟周期有两个edge,分别称为:(1)Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候:对于开始电压是0,那么就是0变成 ...

  5. 网站设置http到https

    首先ssl证书配置好,以保证可以正常访问https,若不会请看上一个文章 然后就是http模式访问怎么自动到https呢,很简单 首先在ssl网站根目录创建文件.htaccess,很多用文本文档那样创 ...

  6. Android嵌套滑动不流畅记录随笔

    ---恢复内容开始--- 今天第一次用到ScrollView嵌套RecyclerView来做页面. 刚开始效果开心得很,非常Very漂亮噢! 纳尼!!!沃特Fuck!出事儿,出事儿! 滑动为何如此不流 ...

  7. Struts2多文件上传原理和示例

    一.创建上传文件的页面,代码如下所示     1.Struts2也可以很方便地实现多文件上传. 在输入表单域增加多个文件域:multifileupload.jsp    <%@ page lan ...

  8. HTML5 新的 Input 类型

    Input 类型: color(拾色器) color 类型用在input字段主要用于选取颜色,如下所示: 支持浏览器 实例 从拾色器中选择一个颜色: 选择你喜欢的颜色: <input type= ...

  9. Galaxy2D Game Engine 4.2

    Galaxy2D Game Engine 4.2 开发版  下载地址  D3DRender注意:1.下载后的压缩包请使用WinRar5.0打开.2.开发版包含了现在正在开发中的Galaxy2D游戏引擎 ...

  10. Redis深入学习笔记(三)RDB及AOF流程

    RDB是Redis持久化数据的一种方式,是执行时间点的Redis内存快照,redis数据还原时加载rdb文件,Redis的主从数据同步也是基于RDB实现的. RDB流程: 1)执行bgsave命令,R ...