不能移動的石子合併

2021-09-29 01:25:22 字數 2142 閱讀 9680

時間限制:1000ms  記憶體限制:1000k

提交次數:0 通過次數:0

題型: 程式設計題   語言: g++;gcc;vc

做如下兩個模型的石子合併,如下模型石子都不能移動出列,且合併都僅發生在相鄰兩堆石子中:

(1)第乙個模型:一行排列且相鄰合併

有n堆石子a1,a2,...,an形成一行,每堆石頭個數記為ai(1<=i<=n),相鄰兩堆可合併,合併的分值為新堆的

石子數。求合併為一堆的最低得分和最高得分。

(2)第二個模型:一圈排列且相鄰合併

有n堆石子a1,a2,...,an形成首位相連的乙個環形,an和a1相鄰,每堆石頭個數記為ai(1<=i<=n),相鄰兩堆

可合併,合併的分值為新堆的石子數。求合併為一堆的最低得分和最高得分。

例如4堆石子,每堆石子個數:9 4 4 5

若排成一行,最小分值:(4+4)+(8+5)+(9+13)=43,最大分值:(9+4)+(13+4)+(17+5)=52。

若排成圈狀,最小分值:(4+4)+(8+5)+(9+13)=43,最大分值:(9+5)+(14+4)+(18+4)=54。

此題以第一模型的最低得分為例,很多同學想著採用總是從最小的相鄰兩堆下手的思想,認為最後獲得的也就是最

低得分。但這個貪心策略是不對的。如下反例:

石子:9 4 6 1 5

貪心策略:

9 4 6 6 計分6

9 10 6 計分10

9 16 計分16

25 計分25

得分共計:6+10+16+25=57

但9 4 6 1 5 若如下方式合併:

13 6 1 5 計分13

13 6 6 計分6

13 12 計分12

25 計分25

13+6+12+25=56

或9 4 6 6 計分6

9 4 12 計分12

13 12 計分13

25 計分25

6+12+13+25=56

後兩種方式合併出的56都比貪心策略的57來的更低,因為總選擇最小的相鄰兩堆去合併,並不能保證後續每步

都可以最小,也許這輪最小導致後續幾輪分值較大。

兩行。第一行n,第二行a1 a2 … an,每個ai(1<=i<=n)表示第i堆石子的個數,n<=100

兩行。第一行是第乙個模型的最低得分和最高得分,中間空格相連,第二行是第二個模型的最低得分和

最高得分,中間空格相連。

4

9 4 4 5

43 52

43 54

(1)第乙個石子合併模型

和書上3.1節的矩陣連乘問題類似。假設m[i,j]為合併石子ai…aj,1<=i<=j<=n。所得到的最小

得分,若沒有「合併」這個動作,則為0。

原問題所求的合併最小值即為m[1,n]。

遞推公式如下,其中min表示求最小,sum表示求和。

m[i,j] = 0, if i=j

m[i,j] = min;

int mm[500][500]=;

int m1(int i,int j)

int k;

int min1=60000;

int sum=0;

if(i==j)

else if(i(m1(i,k)+m1(k+1,j)))

}for(int t=i;t<=j;t++)

mm[i][j]=(min1+sum);

return (min1+sum);}}

int m1(int i,int j)

int k;

int max1=0;

int sum=0;

if(i==j)

else if(im1(k,n+k-1))

min3=m1(k,n+k-1);

}return min3;

}int m2(int i,int j)

for(int i=n+1;i<2*n;i++)

cout

}

可以移動的石子合併

有n堆石子形成一行 a1,a2,an,ai為第i堆石子個數 現要將石子合併成一堆,規定每次可選擇至少2堆最多k堆移出然後合併,每次合併的分值為新堆的石子數。若干次合併後,石子最後肯定被合併為一堆,得分為每次合併的分值之和。現在求解將這n堆石子合併成一堆的最低得分和最高得分。1 保證每次選兩堆最多的,...

11079 可以移動的石子合併

11079 可以移動的石子合併 時間限制 1000ms 記憶體限制 1000k 題型 程式設計題語言 無限制 description 有n堆石子形成一行 a1,a2,an,ai為第i堆石子個數 現要將石子合併成一堆,規定每次可選擇至少2堆最多k堆移出然後合併,每次合併的分值為新堆的石子數。若干次合併...

不能移動的石頭合併問題

做如下兩個模型的石子合併,如下模型石子都不能移動出列,且合併都僅發生在相鄰兩堆石子中 1 第乙個模型 一行排列且相鄰合併 有n堆石子a1,a2,an形成一行,每堆石頭個數記為ai 1 i n 相鄰兩堆可合併,合併的分值為新堆的 石子數。求合併為一堆的最低得分和最高得分。2 第二個模型 一圈排列且相鄰...