【循环数组的最大字串和】Maximal-sum Subsequence
【循环数组的最大字串和】Maximal-sum Subsequence
PROBLEM
题目描述
给一个 N×N 的矩阵 M,可以取连续的一段数(必须是横着或者竖着或者斜着,这个矩阵是循环的,具体如下)。要求找到一个子序列,使得这个序列的和最大。

对于 N=8 的矩阵,如下序列都是合法的:
M2,1,M2,2,M2,3,M2,4,M2,5,M2,6,M2,7,M2,8.
M2,2,M2,3,M2,4.
M2,6,M2,7,M2,8,M2,1,M2,2.
M4,3,M5,3,M6,3,M7,3.
M1,2,M2,3,M3,4,M4,5.
M2,4,M3,3,M4,2,M5,1.
M3,3,M4,2,M5,1,M1,5. (按样例理解是M8,6 ,emmmmm)
M5,6.
一个元素不可取多次,取的必须是连续的一段。
可以什么都不取(即答案为 0)。
输入
第一行一个数 T (T≤30),表示数据组数。
每一组数据第一行为一个正整数 N (1≤N≤1000)。
接下来 N 行每行 N 个数表示这个矩阵。(每个元素大小在 −32768 到 32767 之间)
输出
每组数据一行表示最大的序列和。
样例输入
1
4
8 6 6 1
-3 4 0 5
4 2 1 9
1 -9 9 -2
样例输出
24
提示
样例解释:选取序列 M3,4,M4,3,M1,2。
SOLUTION
题面好像有点问题,应该按照提示(样例)来理解。
首先你要会如何求数组的最大字串和。
然后循环数组最大字串和 = max(数组求和+数组元素取反后的最大字串和,原数组的最大字串和)
最后每行每列以及所有斜向上的答案取最值即可。
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2005;
int martix[MAXN][MAXN];
int dp[MAXN];
int py(int x,int n){
while (x<0)x+=n;
while (x>=n)x-=n;
return x;
}
int cal(int arr[],int n) {
int sum = 0;
memset(dp, 0, sizeof(dp));
sum = dp[0] = arr[0];
for (int i = 1; i < n; i++) {
dp[i] = max(arr[i], dp[i-1]+arr[i]);
sum += arr[i];
}
int ans = 0;
for (int i = 1; i < n; i++) {
if (dp[i] > dp[ans]) {
ans = i;
}
}
int ans1 = dp[ans];
for (int i = 0; i < n; i++) {
arr[i] = -arr[i];
}
memset(dp, 0, sizeof(dp));
dp[0] = arr[0];
for (int i = 1; i < n; i++) {
dp[i] = max(arr[i], dp[i-1]+arr[i]);
}
ans = 0;
for (int i = 1; i < n; i++) {
if (dp[i] > dp[ans]) {
ans = i;
}
}
int ans2 = dp[ans];
return max(ans1,ans2+sum);
}
int main(){
int T;
for(scanf("%d",&T);T;T--){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&martix[i][j]);
}
}
int ans = 0;
for(int i=0;i<n;i++){
int carry[MAXN];
for(int j=0;j<n;j++){
carry[j] = martix[i][j];
}
ans = max(ans,cal(carry,n));
for(int j=0;j<n;j++){
carry[j] = martix[j][i];
}
ans = max(ans,cal(carry,n));
for(int j=0;j<n;j++){
carry[j] = martix[py(i-j,n)][py(j,n)];
}
ans = max(ans,cal(carry,n));
for(int j=0;j<n;j++){
carry[j] = martix[py(i-j,n)][py(n-j-1,n)];
}
ans = max(ans,cal(carry,n));
}
cout<<ans<<endl;
}
}
【循环数组的最大字串和】Maximal-sum Subsequence的更多相关文章
- 1042 数字0-9的数量 1050 循环数组最大子段和 1062 序列中最大的数 1067 Bash游戏 V2 1092 回文字符串
1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次 ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- lintcode循环数组之连续子数组求和
v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...
- 51nod 1050 循环数组最大子段和
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...
- 深入理解循环队列----循环数组实现ArrayDeque
我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...
- shell 循环数组
循环数组 ;i<${#o[*]};i++)) do echo ${o[$i]} done
- 整理JavaScript循环数组和对象的方法
众所周知,常用的循环语句有for.while.do-while.for-in,forEach以及jQuery中提供的循环的方法:以及ES6中提供的很多用来循环对象的方法如map, 在 Javascri ...
- CodeForces 598B(循环数组)
对于循环数组的问题,就是找偏移K后位置 偏移后位置=起始位置+(相对位置+K)%(长度+1) #include <iostream> #include <string> #in ...
- 51Nod 1050 循环数组最大子段和 | DP
Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 分析: 有两种可能,第一种为正常从[1 - n]序列中的最大子字段和:第二种为数组的total_sum - ([1-n] ...
随机推荐
- 纯js Ajax 请求
var XMLHttpReq; function createXMLHttpRequest() { if(window.ActiveXObject ) { try { XMLHttpReq = new ...
- MessagePack for C#
MessagePack for C# 快速序列化组件MessagePack介绍 简介 MessagePack for C#(MessagePack-CSharp)是用于C#的极速MessagePa ...
- MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法
MySQL都有什么锁? MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度 ...
- [物理学与PDEs]第3章习题2 仅受重力作用的定常不可压流理想流体沿流线的一个守恒量
设定常 (即 $\cfrac{\p {\bf u}}{\p t}={\bf 0}$).不可压缩 (设 $\rho=1$) 的理想流体所受的体积力仅为重力. 又设磁场满足条件: $({\bf H}\cd ...
- CentOS 7 破解root密码
破解root密码必须在本机上进行,如果使用SecureCRT Xshell等远程工具修改是会出错的! A0 哥们儿,忘记密码了,怎么办??? A1.进入启动界面: A2. 按‘e’键进入编辑模式 A ...
- IIS--互联网信息服务
IIS--互联网信息服务 1.IIS是微软出品的一个服务器插件 2.IIS的功能:1)发布web网站 2)发布ftp站点 WEB服务器:1.监听TCP80端口 --- http://www.baidu ...
- 网络学习day01_计算机网络与分层思想
2018.9.1 网络学习day01_计算机网络与分层思想 网络安全 计算机网络 分层思想 LAN与WAN LAN(Local Area Network)--局域网 局域网(Local ...
- Illegal invocation with document.querySelector [duplicate]
document.querySelectorAll赋给其它变量时, 为什么要.bind(document)? https://stackoverflow.com/questions/12637061/ ...
- 网络编程中select模型和poll模型学习(linux)
一.概述 并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题.操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题.这两个函数都能够 ...
- 【算法】【python实现】二叉搜索树插入、删除、查找
二叉搜索树 定义:如果一颗二叉树的每个节点对应一个关键码值,且关键码值的组织是有顺序的,例如左子节点值小于父节点值,父节点值小于右子节点值,则这棵二叉树是一棵二叉搜索树. 类(TreeNode):定义 ...