最小正子序列和(minimun subsequences sum)

Purplish 2011-08-04 09:43:38
比如:4,-1,5,-2,-1,2,6,-2 正确结果应该是1。

比较老的一个题目了,没有google到一个合适的答案。所以发帖问问。
...全文
823 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
pandm 2012-06-23
  • 打赏
  • 举报
回复
litaoye真的好强啊!
hnu_0720 2012-06-18
  • 打赏
  • 举报
回复
O(N)算法好像有点难啊!楼上的代码明显有错误啊!
else if(tmp < 0)
{
tmp = 0;
}
表示没有搞懂为什么?这个和求最大那个有本质的区别吧!
chenjkai1988 2012-06-16
  • 打赏
  • 举报
回复
1 #include<stdio.h>
2 #define N 6
3 int minPositiveSubSequenceSum(const int* a)
4 {
5 int i;
6 int tmp, min;
7 tmp = 0;
8 min = 65535;
9 for(i = 0; i<N; i++)
10 {
11 tmp += a[i];
12 if(tmp < min && tmp > 0)
13 {
14 min = tmp;
15 }
16 else if(tmp < 0)
17 {
18 tmp = 0;
19 }
20 }
21 return min;
22 }
23 int main(int arc, char** arv){
24 int a[N] = {-1, 2, 3, -4, 2, 8};
25 int result = minPositiveSubSequenceSum(a);
26 printf("the result with O(n) is:%d\n", result);
27 }
~
JackBurd 2012-03-12
  • 打赏
  • 举报
回复
有O(n)的算法,只不过不好证明。就是用for 循环累加sum,如果sum<0就将sum置为零。
wangqs1988 2011-12-05
  • 打赏
  • 举报
回复
典型的动态规划,已知前k个以i(1<=i<=k)结尾的结果,求第k+1个
ohmygirl 2011-12-05
  • 打赏
  • 举报
回复
感觉是最大子序列和的加强版呢?
随手写了下,没有测试

#include <stdio.h>
int maxPositive(int *a,int n){
int b = 0,sum = 65535,flag = 1;
int i = 0;
while(i>=0 && i<n){
while(i<n && a[i]<=0){
i++;
}
if(i<n) b = 0;
while(i<n && a[i]>0){
b += a[i];
i++;
}
if(sum > b) sum = b;
}
return sum;
}


main(){
int a[10] = {5,4,-1,1,-1,-4,-5,2,4,2};
printf("%d\n",maxPositive(a,10));
}

绿色夹克衫 2011-12-04
  • 打赏
  • 举报
回复
解释一下为什么只需检查相邻2个数就可以,设ABC是排序后的结果,如果A同B不能组成序列,而A同C可以组成序列,那么B同C也可以组成序列,并且BC会是一个更优的解。

[Quote=引用 20 楼 gogdizzy 的回复:]
6,-1,-1,-1
0,6,5,4,3
排序后
0(0),3(4),4(3),5(2),6(1)

假设这个时候要找值>=4,索引>3的值,那是不是要顺序检查5和6呢?
[/Quote]
绿色夹克衫 2011-12-04
  • 打赏
  • 举报
回复
题目不是找最小正序列么?没明白为什么找值>=4,索引>3?按照排序后的结果来看,只有0和3能组成序列,所以答案就是从第0个元素开始到第4个元素结束。

[Quote=引用 20 楼 gogdizzy 的回复:]
6,-1,-1,-1
0,6,5,4,3
排序后
0(0),3(4),4(3),5(2),6(1)
假设这个时候要找值>=4,索引>3的值,那是不是要顺序检查5和6呢?
[/Quote]
  • 打赏
  • 举报
回复
6,-1,-1,-1
0,6,5,4,3
排序后
0(0),3(4),4(3),5(2),6(1)

假设这个时候要找值>=4,索引>3的值,那是不是要顺序检查5和6呢?


[Quote=引用 19 楼 litaoye 的回复:]
1,-1,-1,-1
0 1 0 -1 -2
-2(4) -1(3) 0(0 2) 1(1)

排序的时候处理一下,数字相等的话可以合并成1个元素,只记录索引的最大最小值就可以了。


引用 18 楼 gogdizzy 的回复:

关键是排序后,最后如何判断。需要找一个原始比自己位置靠后的。

如果是顺序向后找的话,对于1,-1,-1,-1这样的例子,就是O(N^2)的了。
……
[/Quote]
绿色夹克衫 2011-12-04
  • 打赏
  • 举报
回复
1,-1,-1,-1
0 1 0 -1 -2
-2(4) -1(3) 0(0 2) 1(1)

排序的时候处理一下,数字相等的话可以合并成1个元素,只记录索引的最大最小值就可以了。

[Quote=引用 18 楼 gogdizzy 的回复:]

关键是排序后,最后如何判断。需要找一个原始比自己位置靠后的。

如果是顺序向后找的话,对于1,-1,-1,-1这样的例子,就是O(N^2)的了。

引用 17 楼 litaoye 的回复:
最复杂的地方就是个排序,所以是nlog(n)的,不是n^2的

引用 16 楼 yzx714 的回复:
还是O(N^2)的,这个问题我前段时间想了一下,没有想到特别优美的nlogn解法。我的n……
[/Quote]
  • 打赏
  • 举报
回复
关键是排序后,最后如何判断。需要找一个原始比自己位置靠后的。

如果是顺序向后找的话,对于1,-1,-1,-1这样的例子,就是O(N^2)的了。

[Quote=引用 17 楼 litaoye 的回复:]
最复杂的地方就是个排序,所以是nlog(n)的,不是n^2的

引用 16 楼 yzx714 的回复:
还是O(N^2)的,这个问题我前段时间想了一下,没有想到特别优美的nlogn解法。我的nlogn解法是:
[/Quote]
绿色夹克衫 2011-12-04
  • 打赏
  • 举报
回复
最复杂的地方就是个排序,所以是nlog(n)的,不是n^2的
[Quote=引用 16 楼 yzx714 的回复:]
还是O(N^2)的,这个问题我前段时间想了一下,没有想到特别优美的nlogn解法。我的nlogn解法是:
[/Quote]
  • 打赏
  • 举报
回复
嗯,这回明白了。

[Quote=引用 22 楼 litaoye 的回复:]
解释一下为什么只需检查相邻2个数就可以,设ABC是排序后的结果,如果A同B不能组成序列,而A同C可以组成序列,那么B同C也可以组成序列,并且BC会是一个更优的解。


引用 20 楼 gogdizzy 的回复:
6,-1,-1,-1
0,6,5,4,3
排序后
0(0),3(4),4(3),5(2),6(1)

假设这个时候要找值>=4,索引>3的值,那是不是要顺序检查5和6呢?……
[/Quote]
yzx714 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 litaoye 的回复:]
先求一下从第一位开始的到第i位的累加,
4,-1,5,-2,-1,2,6,-2 => 4 3 8 6 5 7 13 11

对这个累加的数列排个序,然后只要判断邻近的两个数是否可以组成序列,比如4和3就不可以,因为4 > 3而4对应下标为0,3对应为1。4和5就可以
[/Quote]还是O(N^2)的,这个问题我前段时间想了一下,没有想到特别优美的nlogn解法。我的nlogn解法是:

1.先求前缀和,O(n)
2.从左到右遍历前缀和,同时维护一个BST,对于每个前缀和,在BST中查找比它小但是最接近它的元素,O(nlogn)。
重要的是维护这个BST的平衡性,所以几乎是必须得使用平衡二叉树,用Treap就够了,实际上,STL中的set支持了upperbound操作,可以直接使用set来解决,代码量也很少
绿色夹克衫 2011-09-20
  • 打赏
  • 举报
回复
4 -1 4可以的,3 4 7,所以是7 - 4 = 3,逻辑严谨一些的话,前面应该加一个什么都不选的0。0 3 4 7

[Quote=引用 11 楼 fanster28_ 的回复:]
4 -1 4
就不行

引用 7 楼 litaoye 的回复:

先求一下从第一位开始的到第i位的累加,
4,-1,5,-2,-1,2,6,-2 => 4 3 8 6 5 7 13 11

对这个累加的数列排个序,然后只要判断邻近的两个数是否可以组成序列,比如4和3就不可以,因为4 > 3而4对应下标为0,3对应为1。4和5就可以
[/Quote]
icessl 2011-09-20
  • 打赏
  • 举报
回复
楼主对"子序列"定义不明.{A,C} 是 {A,B,C} 的子序列吗?
asdf9666 2011-09-20
  • 打赏
  • 举报
回复
持续关注中。。。。。。。
SuperFC 2011-09-20
  • 打赏
  • 举报
回复
O(N+K)能实现!如果LZ需要代码的话,我会发上去!其实这和求最大子序列和相差不大,不过多了几个判断而已!
fanster28_ 2011-09-19
  • 打赏
  • 举报
回复
4 -1 4
就不行

[Quote=引用 7 楼 litaoye 的回复:]

先求一下从第一位开始的到第i位的累加,
4,-1,5,-2,-1,2,6,-2 => 4 3 8 6 5 7 13 11

对这个累加的数列排个序,然后只要判断邻近的两个数是否可以组成序列,比如4和3就不可以,因为4 > 3而4对应下标为0,3对应为1。4和5就可以
[/Quote]
阿尔博特 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zzzgwzz 的回复:]
这题有时间少于o(N^2)的算法吗? 同求
[/Quote]
有 O(N)的
加载更多回复(9)

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧