谁能描述下隔山打牛符石是什么姿势

4504人阅读
问题描述:
& & & 连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个。
& & & 比如例如给定序列:
& & & & & &{ -2, 11, -4, 13, -5, -2 }
& & & & 其最大连续子序列为{ 11, -4, 13 },最大和为20。
===============================================================
问题分析:
1.首先最朴素的方法是暴力&O(n^3)
& & & &直接两个for循环枚举子序列的首尾,然后再来个循环计算序列的和,每次更新和的最大值。
& & & & 但是这种方法的复杂度是O(n^3),效率实在太低了。。。
————————————————————————————————————————————————
2.第二种方法是预处理&O(n^2)
& & & &在读入的时候将前面数的和放在数组中,就能得到一个数组sum[i]储存前i个数的和。然后两重循环枚举首尾,利用sum数组迅速求出子序列的和。
& & & & 其实这种方法只是优化了前面那种方法的计算和的循环,复杂的是O(n^2),也很糟糕。
————————————————————————————————————————————————
3.第三种是利用分治思想&O(nlogn)
& & &&分治算法但看代码不是很好理解,其实思想很简单,就是把序列分成两块计算,用递归分别求出两块序列中的最大子序列和,然后从序列中间向两边遍历求出包含中心的序列的最大和。返回最大的那个序列和。
& & & &递归真的很神奇,一直把问题分解乘小问题交给下一层递归处理,直到最底层。
& & & &用分治算法的复杂度好了一些,是O(nlogn),虽然不是最优解,但是理解这种算法的确能让我们对递归理解得更加深刻。
————————————————————————————————————————————————
4.第四种是累积遍历算法&O(n)
& &&& 遍历序列的时候对Sum进行累计,如果Sum累积后小于0的话就把Sum重置为负无穷,每次更新Sum的最大值。最后便能求出最大值。
& & & &其实这个算法就是把序列分为好几块,每一块满足:对于任意k,前k个数的和不会小于0(小于0就会分裂成两块了),当前i个数的和大于最大值时就进行更新,而最大值的左边界就是该块序列的第一个,右边界是第i个。
& & & &时间复杂度为O(n),而且可以一边读取一边处理,不需要开辟数组来存,空间也很省。
------------------------------------------------------------------------------
& &举个例子:&
-10& &<span style="color:#ff &3 &4 &-5 & -23& &3 &7& &&-21 & (num)
1 &3 &6 10 &8 | -23 | &3 10 | -21 & (Sum)(|号为该处Sum被清零)
& &由于10是Sum的最大&#20540;,所以,红色的那块就是要求的范围了。
------------------------------------------------------------------------------
& & &但是为什么所求序列为什么是在序列块中并且是以序列块第一个数作为开头呢?
证明:如果不是这样的话,会有几种情况:
& & & & & 1 &该目标序列跨越了几个块。由于Sum在&=0的时候会重置为负无穷,如果跨块的话,没有重置那它的和肯定不会是最大的。
& & & & & 2 &该目标序列在序列块中间,且目标序列的开头并不是序列的第一个。由于序列块前k个数的和不会小于0,所以这样肯定没有从第一个开始来的大。
————————————————————————————————————————————————
5.第五种是动态规划&O(n)
& & & & dp做法是很普遍的做法,只要想出状态转移方程就可以很快做出来了。
& & & & 状态转移方程:sum[i] = max{sum[i-1]&#43;a[i],a[i]}. (sum[i]记录以a[i]为子序列末端的最大连续和。)在dp的过程中便可以更新sum数组的最大&#20540;以及两个边界。
& & & & 其实完全可以不用开数组,累计sum直到sum &#43; a & a,把sum赋&#20540;为a,更新最大&#20540;就行了。你会发现这跟第4种方法是一样的。。。只是判断条件不一样,一个是sum &= 0一个是sum &#43; a & a。。。(其实是一样的。。。)所以复杂度和第四种是一样的都是O(n)。
————————————————————————————————————————————————
6.第六种是第二种累计求和&O(n)
& & & &(感谢@shuangde800 大神的指导)
& & & & &这种方法跟第4种一样是累计求和。我们可以发现,连续子序列的和其实就是 (到尾端的和)-(到首端-1的和),要让这个式子最大其实可以让(到首端-1的和)尽量的小,我们可以遍历数组,维护(到首端-1的和)的最小&#20540;。
& & & & &理解起来就是遍历的时候,找出以当前位置为尾端,以此前的某一点为首端的
和最大的子序列,然后更新最大&#20540;。(其实这个思想和第五种方法是异曲同工的)
& & & & &由于只需要一遍遍历,所以复杂度为O(n)。
===============================================================
由于下面的Solution里面我的代码太挫,于是先贴出伪代码。
1.暴力 O(n^3):
max←(-∞)
for i←1 to len do
for j←i to len do
for k←i to j
sum←sum+arr[i]
// 更新最大值
if sum&max then
return max
2.预处理 O(n^2):
// 记录前i项和
for i←1 to len do
sum[i]←sum[i-1]+arr[i]
// 枚举首尾
max←(-∞)
for i←1 to len do
for j←i to len do
// 更新最大值
if sum[j]-sum[i-1]&max then
max←sum[j]-sum[i-1]
return max
3.分治算法 O(nlogn)
function maxsum(arr,left,right)
// 只有一个元素就返回
if right-left=1 then
// 划分[left,mid)和[mid,left)分治
mid←x+(y-x)/2
L←maxsum(arr,left,mid)
R←maxsum(arr,mid,left)
if L&R then
// 求出处于中间的连续子序列最大和
// 先求从中间向左最大值
tempSum←0
leftSum←arr[m-1]
for i←m-1 downto right do
tempSum←tempSum+arr[i]
if leftSum&tempSum then
leftSum←tempSum
// 再求从中间向右最大值
tempSum←0
rightSum←arr[m]
for i←m to left do
tempSum←tempSum+arr[i]
if rightSum&tempSum then
rightSum←tempSum
midSum←leftSum+rightSum
if max&midSum then
max←midSum
return max
end function
4.累积遍历算法 O(n)
max←arr[0]
for i←1 to len do
if sum&=0 then
if max&sum then
return max
5.动态规划 O(n)
sum←(-∞)
max←(-∞)
for i←1 to len do
if sum+arr[i]&arr[i] then
sum←arr[i]
sum←sum+arr[i]
if max&sum then
return max
6.第二种累计求和 O(n)
for i←1 to len do
sum←sum+arr[i]
temp←sum-recMin
// 更新max
if temp&max then
// 更新recMin
if recMin&sum then
recMin←sum
===============================================================
hdu这两题都是要求边界的。
代码如下:
& & & &题意:求出给出序列中和最大的连续子序列,以及该序列的左边界和右边界
&累积遍历算法(会TLE)
http://blog.csdn.net/hcbbt
Create Date:
Descripton:
max sum of continuous sequence, simulation
#include &cstdio&
#define rep(i, n) for (int i = 0; i & (n); i++)
const int MAXN = 100100;
int k, a[MAXN];
int main() {
scanf(&%d&, &n);
rep(cas, n) {
scanf(&%d&, &k);
rep(i, k) scanf(&%d&, &a[i]);
int res = a[0], rl = 0, rr = 0;
int sum = 0, l = 0;
rep(i, k) {
if (sum & 0) {
sum = a[i];
sum += a[i];
if (res & sum) res = sum, rl = l, rr =
if (cas) printf(&\n&);
printf(&Case %d:\n&, cas + 1);
printf(&%d %d %d\n&, res, rl + 1, rr + 1);
http://blog.csdn.net/hcbbt
Create Date:
Descripton:
max sum of continuous sequence, dp
#include &cstdio&
#define rep(i, n) for (int i = 0; i & (n); i++)
int main() {
int l, R, L, Max, sum, k, t, cas,
scanf(&%d&, &n);
rep(cas, n) {
sum = Max = -0
scanf(&%d&, &k);
rep (i, k) {
scanf(&%d&, &t);
if (sum + t & t) sum = t, l =
else sum +=
if (Max & sum) Max = sum, L = l, R =
if (cas) printf(&\n&);
printf(&Case %d:\n&, cas + 1);
printf(&%d %d %d\n&, Max, L + 1, R + 1);
第二种累计求和
http://blog.csdn.net/hcbbt
Create Date:
Descripton:
#include &cstdio&
int n, a[1000000];
int max, recMin, sum, l, recL, recR;
int main() {
scanf(&%d&, &k);
for (int cas = 1; cas &= cas++) {
scanf(&%d&, &n);
for (int i = 0; i & i++) scanf(&%d&, &a[i]);
recMin = 0;
recL = -1, recR = 0;
for (int i = 0; i & i++) {
sum += a[i];
if (sum - recMin & max) {
max = sum - recM
if (recMin & sum) {
if (cas - 1) printf(&\n&);
printf(&Case %d:\n%d %d %d\n&, cas, max, recL + 2, recR + 1);
————————————————————————————————————————————————
& & & & 题意:求连续子序列最大和及上下界的&#20540;,输出还得处理下
http://blog.csdn.net/hcbbt
hdu1231.cpp
Create Date:
Descripton:
hdu1231, max sum of continuous sequence, pre, O(n^2)
#include &cstdio&
#define rep(i, n) for (int i = 0; i & (n); i++)
#define repf(i, a, b) for (int i = (a); i &= (b); i++)
const int MAXN = 10010;
int k, s[MAXN], a[MAXN];
int main() {
while (scanf(&%d&, &k) && k) {
repf(i, 1, k) {
scanf(&%d&, &a[i]);
s[i] = s[i - 1] + a[i];
int ans, l,
ans = l = r = s[1];
repf(i, 1, k) repf(j, i, k)
if (ans & s[j] - s[i - 1]) {
ans = s[j] - s[i - 1];
if (ans &= 0)
printf(&%d %d %d\n&, ans, l, r);
printf(&0 %d %d\n&, a[1], a[k]);
http://blog.csdn.net/hcbbt
2_hdu1231.cpp
Create Date:
Descripton:
hdu1231, max sum of continuous sequence, partition
#include &cstdio&
#define rep(i, n) for (int i = 0; i & (n); i++)
const int MAXN = 10010;
struct ANS {
ANS(int a, int b, int c) : sum(a), l(b), r(c) {}
ANS maxsum(int* a, int x, int y) {
int m, v, L, R, l,
ANS M(a[x], a[x], a[x]), t1, t2;
if (y - x == 1)
m = x + (y - x) / 2;
t1 = maxsum(a, x, m);
t2 = maxsum(a, m, y);
if (t1.sum &= t2.sum) M = t1;
else M = t2;
v = 0; L = a[m - 1]; l = a[m - 1];
for (int i = m - 1; i &= i--){
v += a[i];
if (v & L) L = v, l = a[i];
v = 0; R = a[m]; r = a[m];
for (int i = i & i++) {
v += a[i];
if (v & R) R = v, r = a[i];
if (M.sum & (L + R))
return ANS(L + R, l, r);
int k, a[MAXN];
int main() {
while (scanf(&%d&, &k) && k) {
rep(i, k) scanf(&%d&, &a[i]);
ANS ans = maxsum(a, 0, k);
if (ans.sum &= 0)
printf(&%d %d %d\n&, ans.sum, ans.l, ans.r);
printf(&0 %d %d\n&, a[0], a[k - 1]);
&累积遍历算法
http://blog.csdn.net/hcbbt
Create Date:
Descripton:
max sum of continuous sequence, simulation
#include &cstdio&
#define rep(i, n) for (int i = 0; i & (n); i++)
const int MAXN = 10010;
int k, a[MAXN];
int main() {
while (scanf(&%d&, &k) && k) {
rep(i, k) scanf(&%d&, &a[i]);
int res = a[0], rl = a[0], rr = a[k - 1];
int sum = 0, l = 0;
rep(i, k) {
if (sum &= 0) {
sum = a[i];
sum += a[i];
if (res & sum) res = sum, rl = l, rr = a[i];
if (res &= 0)
printf(&%d %d %d\n&, res, rl, rr);
printf(&0 %d %d\n&, a[0], a[k - 1]);
http://blog.csdn.net/hcbbt
Create Date:
Descripton:
max sum of continuous sequence, dp
#include &cstdio&
#define rep(i, n) for (int i = 0; i & (n); i++)
int main() {
int l, R, L, Max, sum, k,
while (scanf(&%d&, &k) && k) {
sum = Max = -0
rep (i, k) {
scanf(&%d&, &t);
if (sum + t & t) sum = t, l =
else sum +=
if (Max & sum) Max = sum, L = l, R =
if (Max &= 0)
printf(&%d %d %d\n&, Max, L, R);
printf(&0 %d %d\n&, L, t);
第二种累计求和
http://blog.csdn.net/hcbbt
Create Date:
Descripton:
#include &cstdio&
int n, a[1000000];
int max, recMin, sum, l, recL, recR;
int main() {
while (scanf(&%d&, &n) && n) {
for (int i = 0; i & i++) scanf(&%d&, &a[i]);
recMin = 0;
recL = -1, recR = 0;
for (int i = 0; i & i++) {
sum += a[i];
if (sum - recMin & max) {
max = sum - recM
if (recMin & sum) {
if (max &= 0)
printf(&%d %d %d\n&, max, a[recL + 1], a[recR]);
printf(&0 %d %d\n&, a[0], a[n - 1]);
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:514832次
积分:8447
积分:8447
排名:第979名
原创:389篇
转载:22篇
评论:210条
文章:31篇
阅读:16042
(31)(8)(4)(1)(1)(14)(33)(9)(10)(13)(5)(5)(6)(8)(13)(36)(12)(48)(29)(50)(12)(12)(16)(17)(17)(9)谁能告诉我下洛奇里的休息姿势。_百度知道
谁能告诉我下洛奇里的休息姿势。
可以回答女性的,请问谁能描述下男女的休息姿势玩洛奇有段时间了。PS,但却不知道休息这技能到多少会改变姿势,还有就是听说休息姿势有两种,女性的说明了加分:注明什么姿势时也要说明什么等级,如果不清楚男性的,但最近想升休息了
提问者采纳
&nbsp.这个不因为衣服而改变了&nbsp..休息8~A都是一种姿势..;具体我上图看看男性休息9~7和女生的差不多;&/zhidao/wh%3D600%2C800/sign=34d4546eebf81a4c2667e4cfe71a4c61/1f819beffe550dab44aed2f73e7d6.一种是日式跪坐://a.baidu.hiphotos.;手撑地&nbsp.;就是腿伸直&&nbsp.休息9~7换姿势://a..一种是腿曲到腹部手抱住腿.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.baidu..我比较清楚女生的.但是穿不同的衣服会有所改变...://a.hiphotos..;&nbsp.一种是腿曲起放地上...com/zhidao/pic/item/1f819beffe550dab44aed2f73e7d6.jpg" esrc="http../zhidao/wh%3D450%2C600/sign=e11edaab2f0d/1f819beffe550dab44aed2f73e7d6.;是固定的.区别是男的一只脚会曲起<a href="http.&&nbsp
提问者评价
谢谢大家。
其他类似问题
为您推荐:
其他2条回答
9级改变姿势 女的9级以前穿810是跪的 穿袍子是做着抱着腿 改变后统一成双腿伸展双手后支的姿势
男的9级前2种 穿袍子时2腿伸展手在肚前
还有一种单腿伸展单腿曲
9几后单腿伸展单腿曲 1手在后支地1手放在地上 另外还有巨人的姿势 我只见过2种男的 和和尚差不多 打坐
女的2腿向后曲2手在前
我还没见过休息9以后的巨人
精灵和人类是一样的姿势
洛奇的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 699|回复: 9
照片更生动哦!
老汉推车!观音坐莲!隔山打牛!`````AND SO ON !!!我可以亲自教授!
床前点灯指的是:男猪手指弹了某女的RU头,引发了某女的SEX高潮; 乞丐烧饭指的是:一人平躺,一人趴在下面吹,就像乞丐升火,要趴在地上吹才能燃起来。 边烧鹅腿指的是:女人在前面爬着,男的从后面插入,抱着女人的一只腿,俗称半边烧鹅腿 隔山...
你问梦幻精灵他会给你最详细的答复
明天会更美丽
走路很自然,不做作;衣着时尚不风流 双目迥然有神,她会只看你一眼,然后会望向很远很的地方…… 皮肤洁白无暇……
从此爱上淘宝
都说雷·阿伦投篮标准,如教科书般。其在投篮时手掌背与小臂张角显小,感觉在出手时腕力没有得到充分体现,柔和度还可以再挑剔挑剔,别骂,地球人都知道他其实已经比绝大多数人做得都要好,问题是既然被尊为投篮第一人(至少投篮姿势和弧线),当...
最爽的自慰姿势是什么 相关生活保健:自慰 VIP提问通道 *健康问题描述(发病时间、主要症状、症状变化等) 提问的越详细,医生回答的越清楚哦请输入问题描述,10-500...
6种常见的睡觉姿势-并且发现没一种姿势都与我们的人格有联系。 婴儿式 那些把自己的蜷成婴儿的样子的人被描述为具有同他们的外表一样坚韧而又敏感的内心。当他们初次见某个人的时候可能很害羞,但是很快就会放松下来。这是最常见的睡觉姿势,参...
性交姿势最佳是什么样子已回复 收藏 会员3640025 男 41-50
23:... 提问的越详细,医生回答的越清楚哦请输入问题描述,10-500个汉字。 10/500 ...
简简单单生活
休息8~A都是一种姿势...但是穿不同的衣服会有所改变...我比较清楚女生的..一种是腿曲起放地上...一种是腿曲到腹部手抱住腿..一种是日式跪坐.... 休息9~7换姿势...这个不因为衣服而改变了 是固定的... 就是腿伸直 手撑地 具体我上图看看 男性休息...
Copyright &搜罗全球新鲜玩意儿
爱稀奇比较少直接介绍APP,但是今天这个,无疑是值得分享一下的,因为,这货可以把任何表面变成iPhone的键盘,就像是失传已久的武林绝学隔山打牛,你的手指在妹子身上忙碌——都以为你是个下流坯子呢,正要高呼“不要~停”,但是远远的iPhone却凸显出了你的深邃,那是一篇你刚刚输入的英文原文的《独立宣言》~
嗯,挺神奇的一个技术是吧?其实说白了也简单,iPhone不是内置有加速计么,这款APP的原理就是,通过探测手指敲击时桌面的震动,通过一系列的算法来推测这个震动是在哪个位置发生的,进而将这个位置转换为对应的字符——可不就是隔山打牛么,唐伯虎拇指往地板上一按,远远的华府一干小姐丫鬟的裙子就扬了起来,而且还可以精确打击,想让谁的扬起谁的就扬起……
当然,这个APP,或者说,这项技术,还处于相当前期的阶段,如题图和视频中显示的那样,现在还必须要在桌子上放一个纸做的键盘,然后依次敲击纸按键,让程序记录了每一个按键的位置之后才能开始使用,而一旦位置变了,哦,那可就得重新来了,不然,hello变成f*cku,嘿嘿~所以,感觉起来这货可能更大的意义在于让人明白,哦,iPhone的加速计还可以这么玩吧~就像你,亲,看了这个之后,你觉得你能将这个创意延伸出什么惊人的点子呢? ^ ^
=================== 视频介绍 ===================
=================== 图片介绍 ===================
发明者:Florian Kr?utli(瑞士)
94.34% 的读者认为这个产品不错
&Loading ...
好东西,要与朋友分享:
用微信添加爱稀奇为好友,每天都有新惊喜~
方法:(1)微信扫描左边的二维码;(2)微信添加好友,“爱稀奇”,或者“aixiqi520”,皆可~
1、新鲜资讯第一时间知道;
2、微信快速进入官方爱稀奇拍拍商城。
如果你是爱稀奇的粉丝,微信收听我们,就对了。
这个可以有啊,太牛X了,只是不同表面振动频率不一样,还有敲击的力度,希望不久能在苹果商店里见到
爱稀奇微信公众号
换个姿势上爱稀奇~
订阅是个好习惯
爱稀奇是一个分享新鲜玩意儿的网站,文字均为原创,受保护。
非盈利性质网站/个人Blog若需转载,必须以超链接形式标明文章出处;商业媒体若需转载,请。
Copyright & 2007 - 2014
爱…稀奇~{新鲜:科技:创意:有趣}
- is proudly powered by
Technical by

我要回帖

更多关于 梦想世界隔山打牛 的文章

 

随机推荐