#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ARRAY_SIZE 1000
int buf [ARRAY_SIZE];
int main()
{
srand((unsigned int )time(0));
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)buf[i]=rand()%100-10;
for(i=1;i<=n;i++)printf("%d ",buf[i]);
printf("\n");
//creat random value of buffer and print
//max subsequence sum
long int max_sum=0;
int start=1,end,rs;
for(i=1;i<=n;i++)
{
long int this_sum=0;
start=i;
for(j=i;j<=n;j++)
{
this_sum+=buf[j];
if(this_sum>max_sum)
{
max_sum=this_sum;
rs=start;
end=j;
}
}
}
printf("rs=%d,end=%d,max_sum=%ld\n",rs,end,max_sum);//print result
}
}

//O(n*n)   brute-force

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ARRAY_SIZE 1000
int buf [ARRAY_SIZE];
long int max3(long int a,long int b,long int c)
{
return a>b?(a>c?a:c):(b>c?b:c);
}
long int max_subsequence_sum(int left,int right)
{
if(left==right)
{
if(buf[left]>0)return buf[left];
else return 0;
}
int mid=(left+right)/2;
long int max_left_sum= max_subsequence_sum(left, mid);
long int max_right_sum= max_subsequence_sum(mid+1, right);
int i,j;
long int max_leftbordersum=0,leftbordersum=0;
for(i=mid;i>=left;i--)
{
leftbordersum+=buf[i];
if(leftbordersum>max_leftbordersum) max_leftbordersum=leftbordersum;
}
long int max_rightbordersum=0,rightbordersum=0;
for(i=mid+1;i<=right;i++)
{
rightbordersum+=buf[i];
if(rightbordersum>max_rightbordersum) max_rightbordersum=rightbordersum;
}
return max3(max_left_sum,max_right_sum,max_rightbordersum+max_leftbordersum);
}
int main()
{
srand((unsigned int )time(0));
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)buf[i]=rand()%100-10;
for(i=1;i<=n;i++)printf("%d ",buf[i]);
printf("\n");
//creat random value of buffer and print
//max subsequence sum
long int result=max_subsequence_sum(1,n);
printf("result=%ld\n",result);//print result
}
}

//O(nlgn)divide and conquer

//the pity is no sign of start and end of max subsequence sum

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ARRAY_SIZE 1000
#define RANDOM_SIZE 100
int buf [ARRAY_SIZE];
int main()
{
srand((unsigned int )time(0));
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)buf[i]=rand()%RANDOM_SIZE-RANDOM_SIZE/2;
for(i=1;i<=n;i++)printf("%d ",buf[i]);
printf("\n");
//creat random value of buffer and print
//max subsequence sum
long int max_sum=0;
int start=1,end,rs;
long int this_sum=0;
for(i=1;i<=n;i++)
{
this_sum+=buf[i];
if(this_sum>max_sum)
{
max_sum=this_sum;
rs=start;
end=i;
}
else
{
this_sum=0;
start=i+1;
}
}
printf("rs=%d,end=%d,max_sum=%ld\n",rs,end,max_sum);//print result
}
}

//O(n)

CLRS:Max_sunsequence_sum O(n*n) O(nlgn) O(n)的更多相关文章

  1. 递归O(NlgN)求解逆序数

    导言 第一次了解到逆序数是在高等代数课程上.当时想计算一个数列的逆序数直觉就是用两重循环O(n^2)暴力求解.现在渐渐对归并算法有了一定的认识,因此决定自己用C++代码小试牛刀. 逆序数简介 由自然数 ...

  2. 一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS.

    一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS. 选择算法也就是求一个无序数组中第K大( ...

  3. [Algorithm] 如何正确撸<算法导论>CLRS

    其实算法本身不难,第一遍可以只看伪代码和算法思路.如果想进一步理解的话,第三章那些标记法是非常重要的,就算要花费大量时间才能理解,也不要马马虎虎略过.因为以后的每一章,讲完算法就是这样的分析,精通的话 ...

  4. 经典算法分析:n^2与nlgn

    冒泡.插入.选择排序的时间复杂度为O(n2) Arrays.sort()时间复杂度为nlgn 具体算法实现代码: package recursion; import java.util.Arrays; ...

  5. 算法导论(CLRS)答案

    算法导论(CLRS)答案 Chapter Section I 1 2 p II 1 2 3 p III 1 2 p IV 1 2 3 4 p V 1 2 3 4 p VI 1 2 3 4 5 p VI ...

  6. POJ 3670 Eating Together 二分解法O(nlgn)和O(n)算法

    本题就是一题LIS(最长递增子序列)的问题.本题要求求最长递增子序列和最长递减子序列. dp的解法是O(n*n),这个应该大家都知道.只是本题应该超时了. 由于有O(nlgn)的解法. 可是因为本题的 ...

  7. 低水平选手的自我救赎 (1)CLRS Exercise 16.5-2

    题目大意 给定正整数 $n$ 和一个由 $m$ 个正整数构成的可重集合 $A$,满足 $\forall a\in A, a\le n$ 且 $m\le n$ . 定义 $N_t(A) = |\{a\i ...

  8. 【Bell-Ford 算法】CLRS Exercise 24.1-4,24.1-6

    本文是一篇笔记,大部分内容取自 CLRS 第三版,第 24.1 节. Exercise 24.1-4 Modify the Bellman-Ford algorithm so that it sets ...

  9. poj1631Bridging signals(最长单调递增子序列 nlgn)

    Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12251   Accepted: 6687 ...

随机推荐

  1. codeforces 285 D. Permutation Sum 状压 dfs打表

    题意: 如果有2个排列a,b,定义序列c为: c[i] = (a[i] + b[i] - 2) % n + 1 但是,明显c不一定是一个排列 现在,给出排列的长度n (1 <= n <= ...

  2. NeHe OpenGL教程 第十七课:2D图像文字

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. LPC1768之GPIO

    在AHB总线上以便IO的高速操作,上电默认为输入高电平,支持GPDMA操作. 1只有GPIO0和GPIO2上的引脚能产生中断,/EXIT0~3特殊的外中断引脚. 2P0.29/0.30很特殊要么同为输 ...

  4. 使用Git命令从Github下载代码仓库

    Github作为最大的开源代码仓库,也是作为版本控制工具,简直就是程序员的天堂,是一座挖掘不尽的宝藏.现在讲解一下如何把一个Github上的项目下载到本地,也就是在本地也建立一个项目仓库,以后进行项目 ...

  5. 30天轻松学习javaweb_Range实现断点续传

    package com.wzh.test.http; import java.io.FileOutputStream; import java.io.IOException; import java. ...

  6. Mac 终端常用命令备忘

    Tab 补全 pwd 显示路径 一 .ls ls -lh   查看当前路径详细文件 ls ..     返回上级目录 ls -a   显示隐藏文件 ls -a -l 以详细列表显示 ls ../../ ...

  7. Wex5案例使用JSON传输Thinkphp后端对接,以达成数据正常输出

    初步接触Wex5,操作起来还是觉得比较复杂!而且教程不多,让我着实比较烦躁! 因此自己动手丰衣足食!还是比较实在的! 采用版本:WeX5应用快速开发框架V3.5正式版 我们使用Wex5的仿淘宝APP案 ...

  8. C++学习2

    命名空间(Namespace)主要为了避免命名冲突,其关键字为namespace 在多人代码整合过程中常用到: namespace Li{ //小李的变量声明 ; } namespace Han{ / ...

  9. [ActionScript 3.0] AS3中的位图(BitmapData)应用

    1.位图使用(模糊)滤镜 //创建一个矩形区域的BitmapData var bmd:BitmapData = new BitmapData(80, 30, false, 0xffffff); //画 ...

  10. 你可能不知道的 30 个 Python 语言的特点技巧

        列表按难度排序,常用的语言特征和技巧放在前面. 1.1   分拆 >>> a, b, c = 1, 2, 3>>> a, b, c(1, 2, 3)> ...