Spiral Maximum

题目连接:

http://codeforces.com/problemset/problem/173/C

Description

Let's consider a k × k square, divided into unit squares. Please note that k ≥ 3 and is odd. We'll paint squares starting from the upper left square in the following order: first we move to the right, then down, then to the left, then up, then to the right again and so on. We finish moving in some direction in one of two cases: either we've reached the square's border or the square following after the next square is already painted. We finish painting at the moment when we cannot move in any direction and paint a square. The figure that consists of the painted squares is a spiral.

The figure shows examples of spirals for k = 3, 5, 7, 9.

You have an n × m table, each of its cells contains a number. Let's consider all possible spirals, formed by the table cells. It means that we consider all spirals of any size that don't go beyond the borders of the table. Let's find the sum of the numbers of the cells that form the spiral. You have to find the maximum of those values among all spirals.

Input

The first line contains two integers n and m (3 ≤ n, m ≤ 500) — the sizes of the table.

Each of the next n lines contains m space-separated integers: the j-th number in the i-th line aij ( - 1000 ≤ aij ≤ 1000) is the number recorded in the j-th cell of the i-th row of the table.

Output

Print a single number — the maximum sum of numbers among all spirals.

Sample Input

6 5

0 0 0 0 0

1 1 1 1 1

0 0 0 0 1

1 1 1 0 1

1 0 0 0 1

1 1 1 1 1

Sample Output

17

Hint

题意

给你一个n*m的矩阵,然后问你螺旋线能够覆盖的最大和是多少

每一个正方形都会存在一个螺旋线

螺旋线就是从左上角开始绕成的形状……

题解:

暴力记忆化搜索就好了,n^3可过

但是空间只能n^2,所以滚动数组优化一下就好了

dp[i][j][len]表示以i,j为起点,正方形边长为len的覆盖的值是多少

dp[i][j][len]显然等于len所在的正方形覆盖的和 - mp[i+1][j] - dp[i+1][j+1][len-2]

然后扑通扑通跑dp就好了

因为dp转移只和一层状态有关,所以直接滚动数组优化

代码

#include<bits/stdc++.h>
using namespace std; int n,m;
int mp[520][520];
int sum[520][520];
int vis[520][520];
int dp[520][520][2];
int cal(int x1,int y1,int x2,int y2)
{
return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
}
int solve(int x,int y,int len)
{
if(len==0)
{
dp[x][y][0]=mp[x][y];
return dp[x][y][0];
}
else
{
dp[x][y][0]=cal(x,y,x+len,y+len);
dp[x][y][0]-=mp[x+1][y];
dp[x][y][0]-=dp[x+1][y+1][1];
return dp[x][y][0];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j]=mp[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
int ans = -1e9;
for(int k=0;k<=min(n,m);k+=2)
{
memset(vis,0,sizeof(vis));
for(int i=n;i>=1;i--)
for(int j=m;j>=1;j--)
dp[i][j][1]=dp[i][j][0];
for(int i=n;i>=1;i--)
{
if(i+k>n)continue;
for(int j=m;j>=1;j--)
{
if(j+k>m)continue;
int p = solve(i,j,k);
if(k>0)
ans = max(ans,p);
}
}
}
printf("%d\n",ans);
}

CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化的更多相关文章

  1. CodeForces 132C Logo Turtle (记忆化搜索)

    Description A lot of people associate Logo programming language with turtle graphics. In this case t ...

  2. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  3. CodeForces 918D MADMAX(博弈+记忆化搜索)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  4. CodeForces 173C Spiral Maximum (想法、模拟)

    Spiral Maximum Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Sub ...

  5. Codeforces 667C Reberland Linguistics 记忆化搜索

    链接 Codeforces 667C Reberland Linguistics 题意 给你一个字符串,除去前5个字符串后,使剩下的串有长度为2或3的词根组成,相邻的词根不能重复.找到所有的词根 思路 ...

  6. Codeforces #564div2 E1(记忆化搜索)

    虽然不是正解但毕竟自己做出来了还是记下来吧- 对每个人分别dfs得到其期望,某两维的组合情况有限所以Hash一下避免了MLE. #include <cstdio> #include < ...

  7. 洛谷P1434滑雪题解及记忆化搜索的基本步骤

    题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...

  8. Codeforces Gym 100231G Voracious Steve 记忆化搜索

    Voracious Steve 题目连接: http://codeforces.com/gym/100231/attachments Description 有两个人在玩一个游戏 有一个盆子里面有n个 ...

  9. Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索

    D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...

随机推荐

  1. LoadRunner参数数组

    参数数组提供了对一类参数集中存放的机制,其中LR内置的几个函数有:lr_paramarr_idx().lr_paramarr_len().lr_paramarr_random() 同时参数数组必须满足 ...

  2. jQuery文本框(input textare)事件绑定方法教程

    jquery 的事件绑定已经用on替换了原来的bind,接下来为大家分享下bind的使用方法及input textare事件.目前1.7以上,jquery?的事件绑定已经用on替换了原来的bind,接 ...

  3. Android学习之散乱的知识点

    1. 安卓广告知名平台:有米,哇棒,架势,admob(国外,但效果不好)等,推荐用有米 2. src目录为源文件目录,所有可以被用户修改和创建的Java文件将被存放在这个目录下 3. xml中引用st ...

  4. effective c++:private继承

    如果class间使用private继承关系,编译器就不会自动的将派生类转换为基类,而且private继承而来的成员都变为private属性. private继承意味着根据某物实现出,当我们想要避免重复 ...

  5. Tcl之load

    做一个ASIC项目,基本结构是MCU+ROM+RAM.目前想把单片机程序下载到ROM中,然后在ModelSim中仿真程序,得到运行结果.好二哥给出的Tcl下载文件如下,细细研读中... puts &q ...

  6. 打造自己的Markdown编辑器

    原文链接:  http://www.errdev.com/post/5/ Markdown以其简洁的语法赢得了广大程序猿的喜爱,搜了一下github上相关的web编辑器,星星比较多的 Stackedi ...

  7. nodejs save遇到的一个坑

    混合类型因为没有特定约束,因此可以任意修改,一旦修改了原型,则必须 调用markModified() >>> person.anything = {x:[3,4,{y:'change ...

  8. oracle10g库连接报错

  9. Test log4net

    protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGloba ...

  10. 第二百一十一天 how can i 坚持

    参与感.做项目要有激情. 睡觉.