题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=1768

原题:

A grid that wraps both horizontally and vertically is called a torus. Given a torus where each cell contains an integer, determine the sub-rectangle with the largest sum. The sum of a sub-rectangle is the sum of all the elements in that rectangle. The grid below shows a torus where the maximum sub-rectangle has been shaded.

1

-1

0

0

-4

2

3

-2

-3

2

4

1

-1

5

0

3

-2

1

-3

2

-3

2

4

1

-4

Input

The first line in the input contains the number of test cases (at most 18). Each case starts with an integer N (1≤N≤75) specifying the size of the torus (always square). Then follows N lines describing the torus, each line containing N integers between -100 and 100, inclusive.

Output

For each test case, output a line containing a single integer: the maximum sum of a sub-rectangle within the torus.

样例输入:

2
5
1 -1 0 0 -4
2 3 -2 -3 2
4 1 -1 5 0
3 -2 1 -3 2
-3 2 4 1 -4
3
1 2 3
4 5 6
7 8 9

样例输出:

15

45

思路与总结:

是上一题(UVa 108 - Maximum Sum)的再次升级版。情况变复杂了很多。这个矩阵是可以“循环转动”的。例如,当所有行都上升一行,那么第一行就会变成最后一行(原先第2行变成第1行,第3行变成第2行……), 当所有行下降一行,最后一行就变成第一行。  同理,列也是循环的,把上一句话的所有“行“字变成”列“字就是列循环的情况。

怎样处理这种情况呢?

如果之前做过什么涉及到圆环啊之类的题目,那么肯定马上会想到把在原数组后面再增加重复一遍这个数列的数。 例如1,2,3,4,  处理后变成1,2,3,4,1,2,3。  那么这个新序列就可以枚举圆环出所有的连续序列。

同理,这题需要扩大增加这个矩阵, 把这个存这个矩阵数字的数组的每一行增加一倍, 重复一遍数字, 每一列也增加一倍重复一遍。最后形成一个新的2N*2N的大矩阵。

然后再在这个新的大矩阵中找到尺寸小于等于N*N的子矩阵的最大和。

由于增加了一个限制:子矩阵的尺寸要小于等于N*N, 那么在进行求“最大连续和”的过程时, 要进行线性扫描,这里需要用到单调队列的应用(以前做过一道单调队列求最大连续和长度有限制的题:Max Sum of Max-K-sub-sequence)。单调队列的用处就是维护一个长度小于N的最小值。

代码:

/** UVa: 10827 - Maximum sum on a torus* Time: 0.236s* Author: D_Double*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAXN 250
using namespace std;struct Node{int val; // 值int no;  // 下标
};int arr[MAXN][MAXN], sum[MAXN][MAXN], N, ans;inline void input(){memset(arr, 0, sizeof(arr));memset(sum, 0, sizeof(sum));for(int i=1; i<=N; ++i){for(int j=1; j<=N; ++j)scanf("%d", &arr[i][j]);for(int j=N+1; j<2*N; ++j)arr[i][j]=arr[i][j-N];}for(int i=N+1; i<2*N; ++i){for(int j=1; j<2*N; ++j)arr[i][j] = arr[i-N][j];} // 转化for(int i=1; i<2*N; ++i){for(int j=1; j<2*N; ++j)sum[i][j] = arr[i][j]+sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];}
}inline void solve(){deque<Node>que;Node temp; int maxSum=-2147483646;for(int i=1; i<2*N; ++i){for(int j=(i-N>=0?i-N:0) ; j<i; ++j){ // 枚举que.clear(); // 记住要清空!!int prev=0;for(int k=1; k<2*N; ++k){// 维护单调队列while(!que.empty() && que.back().val > prev)que.pop_back();while(!que.empty() && que.front().no < k-N)que.pop_front();temp.val=prev, temp.no=k-1;que.push_back(temp);int val=sum[i][k]-sum[j][k]-que.front().val;if(val>maxSum) maxSum=val;prev = sum[i][k]-sum[j][k];}}}printf("%d\n", maxSum);
}int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&N);input();solve();}
}
——  生命的意义,在于赋予它意义。
          
     原创 http://blog.csdn.net/shuangde800 , By   D_Double  (转载请标明)

UVa 10827 - Maximum sum on a torus相关推荐

  1. [UVA 10827] Maximum sum on a torus

    图片加载可能有点慢,请跳过题面先看题解,谢谢 这个题..没什么好讲的.. 把矩阵复制,4个拼到一起,二维前缀和+O(n^4) 枚举就过了..但是这个范围.. 不知道给的什么水数据.. 辣鸡题目.. $ ...

  2. URAL 1146 Maximum Sum(最大子矩阵的和 DP)

    Maximum Sum 大意:给你一个n*n的矩阵,求最大的子矩阵的和是多少. 思路:最開始我想的是预处理矩阵,遍历子矩阵的端点,发现复杂度是O(n^4).就不知道该怎么办了.问了一下,是压缩矩阵,转 ...

  3. NOIP前夕:noi.openjudge,Maximum sum

    Maximum sum 总Time Limit: 1000msMemory Limit: 65536kB Description Given a set of n integers: A={a1, a ...

  4. 简单英文题 16 Maximum Sum Not Exceeding K(python)

    http://noi.openjudge.cn/english/16/ """ 简单英文题 16 Maximum Sum Not Exceeding K(AC) http ...

  5. [Swift]LeetCode1031. 两个非重叠子数组的最大和 | Maximum Sum of Two Non-Overlapping Subarrays...

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. D28:Maximum sum(最大和,翻译)

    原题:OpenJudge - 1481:Maximum sum 翻译: 描述:给定一组n个整数:A={a1,a2,...,an},我们定义函数d(A)如下: t1 t2 d(A) = max{ ∑ai ...

  7. 英语翻译 Maximum sum

    OpenJudge - 1481:Maximum sum 2022 2.10 Given a set of n integers: A={a1, a2,..., an}, we define a fu ...

  8. SPOJ KGSS Maximum Sum (线段树)

    SPOJ KGSS Maximum Sum 题意:求区间最大值与第二大值之和 思路:线段树维护两个最大值 /********************************************** ...

  9. Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)

    题目大意:给出 n*n 的矩阵,找每隔数字之和最大的子矩阵,输出最大和.  解题思路:枚举矩阵左上和右下的坐标,分别合并子矩阵的每列,使得二维转化为一维,然后利用连续子序列最大和去做就行. Time ...

  10. [Swift]LeetCode1043. 分隔数组以得到最大和 | Partition Array for Maximum Sum

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

最新文章

  1. qsort归纳学习(c语言版本)
  2. java 复制字段_java - 在构造函数中按字段复制字段 - 我需要一个更简洁的形式 - SO中文参考 - www.soinside.com...
  3. mysql分页总页数算法解析_详解MySQL的limit用法和分页查询语句的性能分析
  4. 15天学习MVC后的小结(分享经历与想法)
  5. 【Gson】2.2.4 StackOverflowError 异常
  6. 批量删除数据库表数据 备份
  7. Ubuntu 18.04安装: failed to load ldlinux.c32
  8. STK与VC++联合编程实战(第二回:STK服务准备初始化)
  9. 富士施乐m115b怎么连接电脑_富士施乐 Fuji Xerox DocuPrint M118w/M118z打印机无线连接设置详解...
  10. 360杀毒软件无视宏病毒!
  11. c语言程序电子琴21个音符,儿童电子琴入门《认识附点音符,二分附点音符》
  12. 2022:股票程序化交易实战2022Q3
  13. 问题1:老毛桃一键装机打开后安装目录只显示u盘
  14. 汇编Ch.5 Ch.6笔记
  15. 解读CUDA Compiler Driver NVCC - Ch.4
  16. Mybatis 直接执行SQL
  17. php 生存分析,生存分析与R--转载
  18. HTML+CSS+JS网页设计期末课程大作业(家居网)
  19. 先瑞达医疗冲刺IPO,上市前夕向股东派发股息超5000万美元
  20. 数论函数 - 莫比乌斯函数与莫比乌斯反演 - 基础杜教筛

热门文章

  1. 牛客网浙江大学机试--找出直系亲属
  2. 计算机声音音乐小星星,迷你世界电路音乐教学 小星星音乐电路
  3. JavaScript 实例:点击漫天小星星 (获取整个浏览器窗口的宽高)
  4. opencv 去高光
  5. UE4第三人称多人联机游戏开发02
  6. 给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1,N=3时,S=1+11+111=123。
  7. UTC世界协调时间和BJT北京时间的转换
  8. w7 声音图标不见了
  9. 2020-02-02
  10. Android编程权威指南第三版 第31章