pascal中最大連續子段和的問題

2022-12-02 12:10:12 字數 5526 閱讀 8117

1樓:匿名使用者

符合題目條件。

子段要符合以下兩個要求:

1. 和最大

2. 長度儘可能大

3. 連續

看例1:

4 -5 3 2 4中,最大連續子段是3 2 4,三者相加為9,長度為3,其他長度為3的子段和皆不大於9,長度大於3的子段也皆不大於9,是故輸出9和3

看例2:

1 2 3 -5 0 7 8中,直觀上就能看出0 7 8和為15,基本上最大連續子段必包含它了,由於1 2 3 -5的和為非負數,與0 7 8合併之後可令子段和及長度都增加,故最大連續子段為1 2 3 -5 0 7 8,輸出16和7

注意:為什麼強調非負,因為在和相同的前提下,將輸出長度更長的連續子列。可是即便如此,也可能存在多個和與長度相同的連續子列,如何將所有符合條件的子列都輸出出來,也需要考慮好。

這道題目很經典,搜「動態規劃」和「最大連續子列」檢視更詳細解釋

2樓:匿名使用者

- -||| 要最大值哎,樣例一-5放進去還能是最大值嗎? 4+(-5)+3+2+4=8<9哎, 第二組 你不把-5放進去的話 連續的最大值也只能是15哎 = =

最大子段和----pascal

3樓:匿名使用者

直接給你寫下程式吧var

a:array[1..100000] of integer;

n,i,ans,len,tmp,beg:longint;

begin

read(n);

for i:=1 to n do

read(a[i]);

tmp:=0;

ans:=0;

len:=0;

beg:=0;

for i:=1 to n do

begin

if tmp+a[i]>ans then

begin

ans:=tmp+a[i];

len:=i-beg;

endelse if (tmp+a[i]=ans) and (i-beg>len) then

len:=i-beg;

if tmp+a[i]<0 then

begin

beg:=i;

tmp:=0;

endelse tmp:=tmp+a[i];

end;

writeln(ans);

end.

什麼是最大連續子段和

4樓:匿名使用者

給出一個數列,數列元素均為負整數、正整數、0。請找出數列中的一個連續子數列,使得這個子數列中包含的所有元素之和最大,在和最大的前提下還要求該子數列包含的元素個數最多,並輸出這個最大和以及該連續子數列中元素的個數。例如數列為4,-5,3,2,4時,輸出9和3;數列為1 2 3 -5 0 7 8時,輸出16和7。

5樓:

連續且非空的一段使得這段和最大

極大化求最大子矩形問題 貼個pascal程式

6樓:匿名使用者

vij p1055

varans,max,s,l,w,i,j,ll,y1,y2:longint;

x,y:array[-1..5002] of longint;

procedure qsort(l,r:longint);

vari,j,p:longint;

begin

i:=l; j:=r; p:=x[(i+j) shr 1];

repeat

while x[i]p do dec(j);

if i<=j then

begin

x[0]:=x[i]; x[i]:=x[j]; x[j]:=x[0];

y[0]:=y[i]; y[i]:=y[j]; y[j]:=y[0];

inc(i); dec(j);

end;

until i>j;

if ix[i]) and (y[j]>=y1) and (y[j]<=y2) then

begin

if ll*(y2-y1)<=ans then break;

max:=(y2-y1)*(x[j]-x[i]);

if max>ans then ans:=max;

if (y[j]>y1) and (y[j]<=y[i]) then y1:=y[j];

if (y[j]=y[i]) then y2:=y[j];

end;

end;

writeln(ans);

end.

若滿意請採納,o(∩_∩)o謝謝

pascal乘積最大問題

7樓:匿名使用者

我們一起來分析一下:

設字串長度為n,乘號數為k,如果n=50,k=1時,

有(n-1)=49種不同的乘法,當k=2時,有c(2,50-1)=1176種乘法,既c(k,n-1)種乘法,當n、k稍微大一些的時候,用窮舉的方法就不行了。

設數字字串為a1a2…an

k=1時:一個乘號可以插在a1a2…an中的n-1個位置,這樣就得到n-1個子串的乘積:

a1*a2…an, a1a2*a3…an, …, a1a2…a n-1*an (這相當於是窮舉的方法)

此時的最大值=max

k=2時,二個乘號可以插在a1a2…an中n-1個位置的任兩個地方, 把這些乘積

分個類,便於觀察規律:

①倒數第一個數作為被乘數:

a1*a2 …a n-3 a n-2 a n-1*an,

a1a2 …*a n-2 a n-1*an,

a1a2 …*a n-1*an。

設符號f[n-1,1]為在前n-1個數中插入一個乘號的最大值,則的最大值為

f[n-1,1]*an。

②倒數第二個數作為被乘數:

a1*a2 …an-3 a n-2* a n-1,

an … a1a2 …*a n-2*a n-1an,

a1a2…*a n-3 a n-2* a n-1 an。

設符號f[n-2,1]為在前n-2個數中插入一個乘號的最大值,則的最大值為

f[n-2,1]*a n-1 an

③倒數第三個數作為被乘數:

… 設符號f[n-3,1]為在前n-3個數中插入一個乘號的最大值,則的最大值為

f[n-3,1]*a n-2 a n-1 an

…… a3~an作為被乘數:f[2,1]*a3 …a n-2 a n-1 an

此時的最大乘積為:

f[n,k]=max

設f[i,j]表示在 i 個數中插入 j 個乘號的最大值,g[i,j]表示從ai到aj的數字列,則可得到動態轉移方程:

f[i,j] = max

(1<=i<=n, 1<=j<=k)

邊界: f[i,0] =g[1,i] (數列本身)

階段:子問題是在子串中插入j-1,j-2……1,0個乘號,因此乘號個數作為階段的劃分(j個階段)

狀態:每個階段隨著被乘數數列的變化劃分狀態。

決策:在每個階段的每種狀態中做出決策。

資料結構:

(此題不需要高精度,pascal用longint即可ac)

int n,k; /* n為數字個數,k為劃分個數*/

int i,j,l; /*迴圈變數*/

char c; /*字元讀入*/

int data[50]=; /*存數字的陣列*/

int g[50][50],f[50][10]; /*g為數字列,f為動態規劃陣列*/

初始化:

cin >> n >> k; /*讀入,n,k*/

for(i=1;i<=n;i++)

for(i=1;i<=n-1;i++)

for(j=i+1;j<=n;j++)

g[i][j]=g[i][j-1]*10+data[j]; /*初始化數列*/

for(i=1;i<=n;i++)

f[i][0]=g[1][i]; /*初始化動態規劃陣列*/

動態規劃:

for(i=1;i<=n;i++)/*方程:f[i,j]表示前i個數中插入j個*號的最優值。*/

for(j=1;j<=i+1;j++)

for(l=1;l<=i-1;l++)

f[i][j]=max(f[i][j],f[l][j-1]*g[l+1][i]);

輸出f[n][k]

8樓:匿名使用者

這是動規題

並且是noip上 吧

不難看看題解就知道了

跪求pascal填空題,大俠幫幫忙!

9樓:水漾橋

什麼內容的,例如閱讀程式寫結果還是完善程式?

先給你道完善程式題:

(最大連續子段和)給出一個數列(元素個數不超過100),數列元素均為負整數、正整數、0。請找出數列中的一個連續子數列,使得這個子數列中包含的所有元素之和最大,在和最大的前提下還要求該子數列包含的元素個數最多,並輸出這個最大和以及該連續子數列中元素的個數。例如數列為 4,-5,3,2,4時,輸出9和3;數列為1 2 3 -5 0 7 8 時,輸出16和7。

vara: array[1..100] of integer;

n, i, ans, len, tmp, beg: integer;

begin

read(n);

for i := 1 to n do

read(a[i]);

tmp := 0;ans := 0;len := 0;

beg := ① ;

for i := 1 to n do

begin

if tmp + a[i] > ans thenbegin

ans := tmp + a[i];

len := i - beg;

endelse if ( ② ) and (i - beg > len) then

len := i - beg;

if tmp + a[i] ③ thenbegin

beg := ④ ;

tmp := 0;

endelse

⑤ ;

end;

writeln(ans, ' ', len);

end.

noip2009裡面的,希望對你有幫助。

以下是答案

① 0② tmp+a[i]=ans或者 a[i]+tmp=ans 或者ans=a[i]+tmp等

③ <0

④ i⑤ inc(tmp, a[i])或者tmp := tmp+a[i]我還有其他題目,不過網上也有,希望能幫到你。

10樓:匿名使用者

我有 2000——2010所有的,郵箱給我

11樓:小葉子

自己去把以前歷年的noip初賽都去做一遍就好了

12樓:匿名使用者

noip初賽試題裡面多得是,自己看

連續奇數的和是135,這連續奇數中最大是多少

135 5 27 分別是23 25 27 29和31 最大是31 有5個連續奇數之和是135,這5個連續奇數分別是多少 135 5 27 27 4 23 27 2 25 2727 2 29 27 4 31 這5個連續的奇數是 23 25 27 29 31.供參考。135 5 27 27 4 23 2...

試證明 在連續的正整數中,最大的數的立方不等於其他兩數立方的和

設三個連續的正整數為n,n 1,n 2 n 0 n 2 3 n 3 6n 2 12n 8n 3 n 1 3 2n 3 3n 2 3n 1 n 2 3 n 3 n 1 3 n 3 3n 2 9n 7 n 1 3 12 n 1 18 n 1 12 n 1 2 18n為整數,n 1為整數 n 1 12 n...

6和068中最大的是誰?最小是誰

3 5 0.6,5 8 0.625 因為 0.6 0.625 0.68 7 6所以 3 5 5 8 0.68 7 6 答 最大的是7 6,最小的是3 5。在3 4,4 5,5 6,6 7,7 8中,最小數與最大數的差是多少 這道題主要是要找出最大和最小數,然後進行求解。觀察可知每個分數的分子都比分母...