【循环数组的最大字串和】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] ...
随机推荐
- G1 垃圾收集器入门
最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的找到一篇写的很棒的文章,粘过来mark下.总结这篇文章和其他的资料,G1可以基本稳定在0.5s到1s左右的延迟,但是并不能保 ...
- Node.js实战项目学习系列(4) node 对象(global、process进程、debug调试)
前言 在之前的课程我们学习了Node的模块化规则,接下来我们将学习下 Node的几个新特性:global ,process进程,debug调试 global 跟在浏览器中的window一样都是全局变量 ...
- python学习04
数据类型-list,tuple 1) 1.1.list的表现方法:[1,2,3,4,5,6] 1.2.计算list的长度用 len() 1.3 list中的索引 a =[1,2,3,4,5] a[1] ...
- RT-SA-2019-004 Cisco RV320 Unauthenticated Diagnostic DataRetrieval
Advisory: Cisco RV320 Unauthenticated Diagnostic Data Retrieval RedTeam Pentesting discovered that t ...
- Arduino传感器学习目录
Arduino-接口图 在Windows上安装Arduino-IDE 函数库和程序架构介绍 Arduino语法-变量和常量 Arduino常用的数据类型以及转换 Arduino—运算符 ...
- shell 批量检测远程端口
[DNyunwei@YZSJHL24-209 li]$ cat port.sh #!/bin/bash # ip=`cat iplist` for i in $ip;do port=`ssh -t $ ...
- Celery - 一个懂得 异步任务 , 定时任务 , 周期任务 的芹菜
1.什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由 1.用户任务 app 2.管道 broker 用于存储 ...
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题 ...
- Django之Model
一.字段 常用字段: AutoField:int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntergerField:一个 ...
- [Kubernetes]谈谈Kubernetes的本质
当下k8s算是比较火的一个内容,那么它到底是什么呢,它为什么会这么火呢,它解决的是什么问题呢.这篇文章就尝试着来讲讲,Kubernetes的本质. 当我们谈Kubernetes的时候,总是会想起来Do ...