時間限制: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
兩行。第一行是第乙個模型的最低得分和最高得分,中間空格相連,第二行是第二個模型的最低得分和最高得分,中間空格相連。
49 4 4 5
43 5243 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 第二個模型 一圈排列且相鄰...