bzoj:1723: [Usaco2009 Feb]The Leprechaun 寻宝
2015-12-10 21:43
330 查看
Description
你难以想象贝茜看到一只妖精在牧场出现时是多么的惊讶.她不是傻瓜,立即猛扑过去,用她那灵活的牛蹄抓住了那只妖精.“你可以许一个愿望,傻大个儿!”妖精说.
“财富,”贝茜用梦游般的声音回答道, “我要获得财富的机会.”
妖精从来没有碰到过这么简单的愿望.他在地方划出一大块N×N(1≤N≤200)的方格,每个格子上写上_1,000,000到1,000,000之间的数字.他说: “在方格上朝一个方向行走,可以是行的方向,列的方向,斜对角的方向,一步只能走一格,所有你踩过的数字的和就是你的财富.”
贝茜请你来帮忙,找到一行、一列或一条对角线上找一段连续的数字,它们的和最大.由于妖精方格的神奇特性,沿着一个方向走,走到了边际,再一步跨过去可以“绕”到方格的对边出现.一行两端的格子是相邻的,一列两端的格子也是相邻的,甚至相邻两行的分别两端的格子也是相邻的(斜对角方向).
对于下图左边的方格,所有标记过的数字都在一条对角线上.
![](http://www.lydsy.com/JudgeOnline/upload/201401/ff(1).jpg)
对于这个方格,能踩出来的最大的和是24,踩过的数字在右图中标记出来了
Input
第1行输入N,之后输入N行N列的矩阵.Output
输出最大的和.Sample Input
48 6 6 1
-3 4 0 5
4 2 1 9
1 -9 9 -2
Sample Output
24![](https://images2015.cnblogs.com/blog/841250/201512/841250-20151210213816386-745111795.png)
![](https://images2015.cnblogs.com/blog/841250/201512/841250-20151210220441824-1594902516.png)
这么差的代码居然#1了……233
暴力枚举不解释,维护前缀和就好了,当然记得要找出最大区间的同时可以找一下最小区间,用总和减最小区间也可以是一种答案
然后注意至少要踩一个格子(被卡了3发……)
#include<cstdio> #include<algorithm> using namespace std; int n,h[200][202],l[200][202],g[200][202],f[200][202],m,i,j; int main(){ scanf("%d",&n); for (i=0;i<n;i++) for (j=0;j<n;j++){ scanf("%d",&m); h[i][j]=h[i][j-1]+m;l[j][i]=l[j][i-1]+m;g[(i-j+2*n)%n][i]=g[(i-j+2*n)%n][i-1]+m;f[(i+j)%n][i]=f[(i+j)%n][i-1]+m; } for (i=0;i<n;i++) for (j=0;j<n;j++){ if (m<h[i][j]-h[i] ) m=h[i][j]-h[i] ; if (m<l[i][j]-l[i] ) m=l[i][j]-l[i] ; if (m<g[i][j]-g[i] ) m=g[i][j]-g[i] ; if (m<f[i][j]-f[i] ) m=f[i][j]-f[i] ; if (m<h[i][n-1]-(h[i][j-1]-h[i][n+1])) m=h[i][n-1]-(h[i][j-1]-h[i][n+1]); if (m<l[i][n-1]-(l[i][j-1]-l[i][n+1])) m=l[i][n-1]-(l[i][j-1]-l[i][n+1]); if (m<g[i][n-1]-(g[i][j-1]-g[i][n+1])) m=g[i][n-1]-(g[i][j-1]-g[i][n+1]); if (m<f[i][n-1]-(f[i][j-1]-f[i][n+1])) m=f[i][n-1]-(f[i][j-1]-f[i][n+1]); if (h[i] >h[i][j]) h[i] =h[i][j]; if (l[i] >l[i][j]) l[i] =l[i][j]; if (g[i] >g[i][j]) g[i] =g[i][j]; if (f[i] >f[i][j]) f[i] =f[i][j]; if (h[i][n+1]<h[i][j]) h[i][n+1]=h[i][j]; if (l[i][n+1]<l[i][j]) l[i][n+1]=l[i][j]; if (g[i][n+1]<g[i][j]) g[i][n+1]=g[i][j]; if (f[i][n+1]<f[i][j]) f[i][n+1]=f[i][j]; } printf("%d\n",m); }
这代码略优美……
相关文章推荐
- JavaScript 初识日记
- html图片热点
- html5基础学习(标签)
- 《剑指offer》——左旋转字符串
- 前端工作的简单化——MVVM框架
- Bootstrap3 为何无法显示Glyphicons 图标
- js 产生随机数
- jQuery $.each用法
- 锋利的JQuery —— 事件和动画
- Javascript设计模式理论与实战:工厂方法模式
- hadoop mkdir: Cannot create directory /usr. Name node is in safe mode.
- EF+MVC+Bootstrap 项目实践 Day2
- Javascript设计模式理论与实战:简单工厂模式
- Javascript设计模式理论与实战:单例模式
- js 获取className元素
- js前台与后台数据交互-前台调后台
- jQuery实现slideRightShow()方法
- Java8新JavaScript引擎nashorn使用实例
- strip_tags去掉HTML标签失败
- JSP个人总结