Standford的一个算法作业题

azhen 2008-04-08 12:14:38
Maximum sum of increasing subsequence

Given an integer array, how will you find out the increasing subsequence which gives the largest sum. For example,
50,23,1,67,30 in this subsequence a few possible increasing subsequences are
1) 23,30
2) 23,67
2) 50,67
3) 1,67
4) 1,30
5) 67
6) 30

but50, 67 gives the maximum sum. How to find it?

我只能想到n^的算法,在网上搜索heaviest increasing string,有现成的解法,复杂度为nlgn,但没看明白.....
...全文
300 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
azhen 2008-04-13
  • 打赏
  • 举报
回复
把贴结了

这道题目关键是在查找怎样使用lgn的算法进行插入

答案是使用线段树或者红黑树.....

!!!
gnefuil 2008-04-12
  • 打赏
  • 举报
回复
按 最长递增子序列 的方法似乎不行吧

这题用个线段树就可以了
www_Zidane_cn 2008-04-11
  • 打赏
  • 举报
回复
so 多牛人。学习...
wang1x 2008-04-10
  • 打赏
  • 举报
回复
MARK!
sparthiul 2008-04-10
  • 打赏
  • 举报
回复
在 最长递增子序列 算法的基础上改造之即可

以b[i] 表示长度为j的 递增子序列中 末尾元素 最小的子序列 的 末尾元素值
以s[i] 表示此子序列的和
int msis(int a[], int n){
if (a == NULL || n <= 0){
return -MAX_INT;
}
int *b = new int[n];
int *s = new int[n];
b[0] = -MAX_INT; s[1] = b[1] = a[0];
s[0] = 0;
int m = s[1];
int len = 2;
for (int i = 1; i < n; i++){
int pos = binarySearch(b,len,a[i]);
b[pos] = a[i];
s[pos] = s[pos - 1] + a[i];
if (pos == len) {
len++;
if (s[pos] > m){
m = s[pos];
}
}
}
return m;
}
mmmcd 2008-04-10
  • 打赏
  • 举报
回复
for (k = 0; k < i; k++) //关键在于此处使用logn复杂度的查找
if (element[k] <= element[i])
MaxSum[i] = max(MaxSum[i], MaxSum[k]+element[i]);

boxer_tony 2008-04-10
  • 打赏
  • 举报
回复
抱歉,我搞错了
boxer_tony 2008-04-10
  • 打赏
  • 举报
回复
借用堆排序的方法,找出最大的两个数不就行了吗?时间复杂度就是O(LOGN)呀
azhen 2008-04-09
  • 打赏
  • 举报
回复
n^2的答案肯定不是想要的,
标准答案里面有一个nlgn的算法,使用了红黑树
我没看懂,所以就转帖来这儿问来了,
e文的答案,如果大家愿意看的话,我可以贴出来
qingyaoli 2008-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhengaw 的回复:]
if (element[k] <= element[i])
MaxSum[i] = max(MaxSum[i], MaxSum[k]+element[i]);
这个不对吧,element[k] <=element[i]不能保证这些小于element[i]的元素都是递增的吧?
[/Quote]
理解错了,是对的。。
qingyaoli 2008-04-09
  • 打赏
  • 举报
回复
if (element[k] <= element[i])
MaxSum[i] = max(MaxSum[i], MaxSum[k]+element[i]);
这个不对吧,element[k]<=element[i]不能保证这些小于element[i]的元素都是递增的吧?
可口可乐 2008-04-08
  • 打赏
  • 举报
回复
一道很简单的动态规划题。
定义数组MaxSum[],
MaxSum[i]是以第i个元素为结尾,能得到的最大递增序列的和。

MaxSum[0] = element[0];
for (i = 1; i < size; i++)
for (k = 0; k < i; k++)
if (element[k] <= element[i])
MaxSum[i] = max(MaxSum[i], MaxSum[k]+element[i]);

得到MaxSum[]数组后找个最大值即可。

不过时间复杂度o(n2)
medie2005 2008-04-08
  • 打赏
  • 举报
回复
lz太牛了吧,stanford...
可口可乐 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aayzaayz 的回复:]
好像MaxSum[0…size]都要初始化为element[0…size]吧
[/Quote]

没错,是要都初始化
aayzaayz 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 brucesea 的回复:]
一道很简单的动态规划题。
定义数组MaxSum[],
MaxSum[i]是以第i个元素为结尾,能得到的最大递增序列的和。

MaxSum[0] = element[0];
for (i = 1; i < size; i++)
for (k = 0; k < i; k++)
if (element[k] <= element[i])
MaxSum[i] = max(MaxSum[i], MaxSum[k]+element[i]);

得到MaxSum[]数组后找个最大值即可。

不过时间复杂度o(n2)
[/Quote]

好像MaxSum[0…size]都要初始化为element[0…size]吧
freeCodeSunny 2008-04-08
  • 打赏
  • 举报
回复
最大子段和
michney 2008-04-08
  • 打赏
  • 举报
回复
mark
oo 2008-04-08
  • 打赏
  • 举报
回复
mark先,回家去想想

33,007

社区成员

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

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