CodeForces 173C Spiral Maximum
2016-04-12 00:11
316 查看
题意:给你一个n*m的矩阵,然后问你螺旋线能够覆盖的最大和是多少
思路:
暴力记忆化搜索,滚动数组优化
dp[i][j][len]表示以i,j为起点,正方形边长为len的覆盖的值是多少
dp[i][j][len]显然等于len所在的正方形覆盖的和 - mp[i+1][j] - dp[i+1][j+1][len-2]
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
Input
Output
Input
Output
Input
Output
Hint
In the first sample the spiral with maximum sum will cover all 1's of the table.
In the second sample the spiral may cover only six 1's.
思路:
暴力记忆化搜索,滚动数组优化
dp[i][j][len]表示以i,j为起点,正方形边长为len的覆盖的值是多少
dp[i][j][len]显然等于len所在的正方形覆盖的和 - mp[i+1][j] - dp[i+1][j+1][len-2]
#include<bits/stdc++.h> using namespace std; #define INF 1e9 int n,m; int mapp[510][510]; int sum[510][510]; int vis[510][510]; int dp[510][510][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]=mapp[x][y]; return dp[x][y][0]; } else { dp[x][y][0]=cal(x,y,x+len,y+len); dp[x][y][0]-=mapp[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",&mapp[i][j]); for (int i = 1;i<=n;i++) for (int j = 1;j<=m;j++) sum[i][j]=mapp[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; int ans = -INF; 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); }
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
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
Output
17
Input
3 3 1 1 1 1 0 0 1 1 1
Output
6
Input
6 6 -3 2 0 1 5 -1 4 -1 2 -3 0 1 -5 1 2 4 1 -2 0 -2 1 3 -1 2 3 1 4 -3 -2 0 -1 2 -1 3 1 2
Output
13
Hint
In the first sample the spiral with maximum sum will cover all 1's of the table.
In the second sample the spiral may cover only six 1's.
相关文章推荐
- 【Lua游戏开发】os库-时间函数 转
- Context详解
- mvc 导入excel表格
- dfs+dp思想的结合------hdu1078
- Leetcode no. 84
- windows下oracle 11g r2 安装过程与卸载详细图解
- 《java编程思想》4版第四章练习生成具有n个数的斐波那契数列
- 2016年4月11号渗透总结
- javaweb基于内容的图片搜索引擎(4)_前台检索以及结果
- NodeJS入门--环境搭建 IntelliJ IDEA
- Win32汇编 Terminalprocess失败
- 再来个封装得更好的RSAHelper
- Centos 源码安装zabbix 2.4.5
- Java-线程池异常信息的坑
- poj 1985 Cow Marathon
- SQL基础语法笔记教程整理
- call,apply,bind
- oracle学习总结3
- 对象数组
- LayoutInflater的用法