摘要: 自己一开始的思路是找连续的正的一定是最大的其实不对,比如5 4 -1 2 8 0 9如果照自己的找法的话,则最大的找的会是2+8,而实际应是5 4 -1 2 8最大,就这样。。。。。所以正确的思路是:找一段最大连续子序列的和,则最大的就是1.这一段加上剩下的子序列中最大的子序列 2.最大子序列减去中间某最小子序列(证明略哪......)所以问题基本转化为求某一段数的最大连续子序列。(附:求最小子序列可以区间全部数取反后求最大子序列....) O(n)算法 直接上代码吧。。 这个自己体会下吧。有点类似于单调队列的思想。 很容易想通的。 for i:= 1 to n do begin s:=s+a 阅读全文
posted @ 2013-05-23 20:31 闭关修炼的小孩纸 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 1 #include <iostream> 2 #include <math.h> 3 #include <cstdio> 4 #define max(a,b) ((a)>(b)?(a):(b)) 5 #define min(a,b) ((a)<(b)?(a):(b)) 6 7 using namespace std; 8 9 const int maxn=50001;10 int h[maxn];11 int mx[maxn][16],mn[maxn][16];12 int n,q;13 14 void rmq_init()15 {16 i.. 阅读全文
posted @ 2013-05-23 08:15 闭关修炼的小孩纸 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 1.全局变量神马的,是得先声明之后才能用的。 就是定义放在使用之前。 而不是只要定义了就行了。2.题目的时限不都是1秒的,有时也有3秒时限的。自己要注意,这对自己的解题会有很大帮助,可以让自己判断一下具体该采用哪种算法、3.左移,就是把数字二进制形式的数字所有位向左移位,后面的位用零补齐。。。。所以,左移一位就是相当于乘以2。。。。左移n位相当于乘以2的n次方。。。 0011<<0001=0110=64.以后自己要习惯用哪种数组方式,下标从1开始is OK!! 通过那个POJ最大公共子序列可以得出一些小经验。 1.若要下标从1开始则scanf("%s",s+1) 阅读全文
posted @ 2013-05-23 07:44 闭关修炼的小孩纸 阅读(112) 评论(0) 推荐(0) 编辑