|洛谷|动态规划|P1736 创意吃鱼法
2016-09-30 19:09
176 查看
http://www.luogu.org/problem/show?pid=1736
先O(nm)预处理r, l, up数组
分别代表在右边连续出现几个0,在左边连续出现几个0,在上边连续出现几个0
即得转移方程,f[i][j]为以i,j作为正方形的右下顶点的最大吃鱼数
主对角线:f[i][j]=min(f[i-1][j-1],left[i][j-1],up[i-1][j])+1
副对角线:f[i][j]=min(f[i-1][j+1],right[i][j+1],up[i-1][j])+1
注意搜索两条对角线要分开搜索
先O(nm)预处理r, l, up数组
分别代表在右边连续出现几个0,在左边连续出现几个0,在上边连续出现几个0
即得转移方程,f[i][j]为以i,j作为正方形的右下顶点的最大吃鱼数
主对角线:f[i][j]=min(f[i-1][j-1],left[i][j-1],up[i-1][j])+1
副对角线:f[i][j]=min(f[i-1][j+1],right[i][j+1],up[i-1][j])+1
注意搜索两条对角线要分开搜索
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define ms(i,j) memset(i,j, sizeof i); using namespace std; int n,m; bool map[2505][2505]; int up[2505][2505], l[2505][2505], r[2505][2505], f[2505][2505]; int main() { scanf("%d%d", &n ,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d", &map[i][j]); ms(up,0); ms(l,0); ms(r,0); for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { if (map[i][j]==0) { up[i][j] = up[i-1][j]+1; l[i][j] = l[i][j-1]+1; } } } for (int i=n;i>0;i--) { for (int j=m;j>0;j--) { if (map[i][j]==0) { r[i][j] = r[i][j+1]+1; } } } ms(f,0); int ans = 0; for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) if (map[i][j]) { f[i][j] = min(f[i-1][j-1], min(up[i-1][j], l[i][j-1]))+1; ans = max(ans, f[i][j]); } } ms(f,0); for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) if (map[i][j]) { f[i][j] = min(f[i-1][j+1], min(up[i-1][j], r[i][j+1]))+1; ans = max(ans, f[i][j]); } } printf("%d\n", ans); return 0; }
相关文章推荐
- 洛谷 P1736 创意吃鱼法
- 洛谷 P1736 创意吃鱼法
- 洛谷P1736 创意吃鱼法
- 洛谷P1736 创意吃鱼法
- 洛谷 P1736 创意吃鱼法
- 洛谷 P1736 创意吃鱼法
- 洛谷 P1736 创意吃鱼法
- 洛谷 P1736 创意吃鱼法
- |洛谷|动态规划|P1282 多米诺骨牌
- 洛谷-最大子段和-动态规划
- 动态规划——洛谷1020_导弹拦截(1999年的)
- 动态规划 洛谷P1070 道路游戏
- 洛谷 动态规划的背包问题(普及连续场)
- 洛谷-多维动态规划-传纸条
- 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]
- |洛谷|动态规划|P2014 选课
- |洛谷|动态规划|P1115 最大子段和
- |洛谷|NOIP2010|动态规划|P1541 乌龟棋
- 洛谷-摆花-动态规划
- |洛谷|动态规划|P1757 通天之分组背包