求和为0的最长连续子序列长度

 

题意:给定一个数组,数组中元素的值只能是1或者-1,求其和为0的最长连续子序列的长度;

    数组为1,-1,1,-1,1,-1,1,-1,其结果为:8

    数组为1,1,-1,1,1,-1,-1,其结果为:6

解析:

  通过分析可知,要使其和为0,只有当1和-1的个数相等时,才会成立,但题目要求是连续子序列,所以单纯统计其1和-1个数不可取。

  由题目中求最长连续子序列,可想到动态规划来求解,动态规划的求解既是寻找其状态转移方程和建立状态转移表的过程

  设dp[i]为下标为i及其之前数组中所有元素的和,

                                               

如图所示,数组为1,-1,1,-1,1,-1,1,-1最后一个值为0,直接满足结果,输出8

如上图,数组1,1,-1,1,1,-1,-1,dp取值为dp[0] = dp[2] = dp[6] = 1; dp[1] = dp[3] = d[5] = 3; dp[4] = 3;

对于每个值,取最后一次出现的位置和第一次出现的位置之差,取它们的最大值,max((6 - 0),(5 - 1),(4 - 4) = 6

代码如下所示:

 1 #include <cstdio>
 2 #include <map>
 3 #include <vector>
 4 #include <iostream>
 5 #include <cstdlib>
 6
 7 using namespace std;
 8
 9 int main()
10 {
11     int n,val;
12     while (cin >> n) {
13         vector<int> arr(n + 1);
14         for (int i = 1; i <= n; i++) {
15             cin >> val;
16             arr[i] = val;
17         }
18         vector<int> dp(n + 1);
19         dp[1] = arr[1];
20         for (int i = 2; i <= n; i++)
21             dp[i] = arr[i] + dp[i - 1];
22
23         //求取dp[i] = dp[j],i表示dp[i]的值第一次出现的位置,j表示其最后一次出现的位置
24         //for (const auto &s : dp)
25         //    cout << s << " ";
26         //cout << endl;
27         map<int, int> m;
28         int begin, max = 0;
29         for (int i = 1; i <= n; i++) {
30             begin = m[dp[i]];
31             if (begin == 0 && dp[i] != 0) {
32                 m[dp[i]] = i;
33             }
34             else {
35                 if (i - begin > max) {
36                     max = i - begin;
37                 }
38             }
39         }
40         cout << max << endl;
41     }
42     system("pause");
43     return 0;
44 }

 

时间: 2024-08-29 04:13:50

求和为0的最长连续子序列长度的相关文章

最长递增子序列长度算法

求最长连续子序列的长度,数字保存在数组中 使用动态规划,理解好转移状态,dp[i]表示i位置下的最大连续子序列长度. 初始状态dp[0] = 1,表示在数组下标为0的时候,它的最长子序列长度就是1, 接着从1开始从左到右扫描,如果后一个数大于前一个数,则它的最长子序列长度增加1,否则, 此位置的最长子序列长度置为1,同时记录下当前的最大子序列长度: 最后返回记录的最大连续子序列变量.代码如下: Code(C++): //最大连续非降序列长度 int maxSubLen(vector<int>

[算法]求数组中最长递增子序列长度

思路: 1.开辟数组L,L[i]记录的为a[0]~a[i]的最长递增子序列长度 2.开辟数组maxV,maxV[i]记录的为长度为i的各递增子序列的最后一个元素的最小值,譬如有子序列 1,2,4 1,2,5 则maxV[3] = 4 3.使用maxLen记录当前的最长递增子序列长度 4.转移方程: L[i+1] = max{1,L[j]+1] , a[i] > maxV[j] && j <= maxLen int LIS(int* a, int n){ int* maxV =

HDU1231 最长连续子序列

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31687    Accepted Submission(s): 14214 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

POJ2479(最长连续子序列和)

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37035   Accepted: 11551 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

算法面试题 之 最长连续子序列之和

参考 http://www.ahathinking.com/archives/120.html var arr = [2, 8,-2, 3, 5, -3, 2]; //传统方法 O(n^2) function fun1(arr){ var maxSum =arr[0]; var maxSumArr = []; for(var i=0; i< arr.length; i++){ var sum = arr[i]; var sumArr = [arr[i]]; for(j=i+1; j<arr.l

leetcode 128. 最长连续子序列

题目描述: 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入:[100, 4, 200, 1, 3, 2] 输出:4 即最长的连续序列为 [1,2,3,4] 思路分析: 由于要求O(n)的复杂读,因此直接排序是不可行的. 这里用到的是并查集的思想.对于每一个数,去查小于1和大于1的数是否在序列中.通过迭代求解. 尽管在 for 循环中嵌套了一个 while 循环,时间复杂度看起来像是二次方级别的.但其实它是线性的算法.因为只有当 current

求最长公共子序列长度

poj 1458  Common Subsequence http://poj.org/problem?id=1458 问题分析: 这个题是求两个序列的最长公共最序列长度,在这里要弄清楚两个问题 1:本题中所有的子序列并没有要求是连续子序列,所以在求最长子序列的时候不连续是允许的 2:哪部分子序列才是最长的 对于给定的 X = < x1, x2, ..., xm > 和 Z = < z1, z2, ..., zk > ,X序列与Z的每一个子序列都含有公共子序列(最小为0),同理,Z

codevs 1862 最长公共子序列(求最长公共子序列长度并统计最长公共子序列的个数)

题目描述 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y="y0,y1,-,yk-1"是X的子序列,存在X的一个严格递增下标序列<i0,i1,-,ik-1>,使得对所有的j=0,1,-,k-1,有xij = yj.例如,X="ABCBDAB",Y="BCDB"是X的一个子序

实习生面试--算法题之字符串最长公共子序列长度

题目:求两字符串的最长公共子序列的长度. 题外话:最长公共子串,子序列问题是被充分讨论的问题,网上一搜一大把,请bing之. 本题只要求求最长公共子序列的长度,而不需要记录最长的公共子序列,给予了我们便利,请参考代码: 1 int max(int a, int b) 2 { 3 return a > b ? a : b; 4 } 5 6 int lcs(char* str1, char* str2) 7 { 8 if (str1 == nullptr || str2 == nullptr) 9