不能移動的石頭合併問題

2021-07-24 18:05:35 字數 1397 閱讀 4766

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

(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。

輸入:4

9 4 4 5

輸出:43 53

43 54

思路

這是一道

動態規劃

問題,與矩陣連乘的最小數乘次數類似,因此求法也類似。

針對第一種模型

,設m[i][j]記錄i到j的

最小得分

情況,將i到j劃分成任意的兩份,則

當 i=j時, m[i][j] = 0;

當 imin

以下為**:
#include #define n 101

#define x 200

using namespace std;

void min1(int a[n], int n, int m[n][n])}}

}void max2(int a[x], int n, int c[x][x])}}

}int main()

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

min1(a,n,m);

cout << m[1][n] << " ";

max1(a,n,m);

cout << m[1][n] << endl;;

min2(b,2*n-1,c);

int temp;

temp = c[1][n];

for(int j=2; j<=n; j++)

cout << temp << " ";

max2(b,2*n-1,c);

temp = c[1][n];

for(int j=2; j<=n; j++)

cout << temp << endl;

return 0;

}

不能移動的石子合併

時間限制 1000ms 記憶體限制 1000k 提交次數 0 通過次數 0 題型 程式設計題 語言 g gcc vc 做如下兩個模型的石子合併,如下模型石子都不能移動出列,且合併都僅發生在相鄰兩堆石子中 1 第乙個模型 一行排列且相鄰合併 有n堆石子a1,a2,an形成一行,每堆石頭個數記為ai 1...

取石頭的問題

n個石頭,2個人依次只能取1 3 4個石頭,取到最後乙個石頭者贏。判斷第乙個取的人是否會贏。下面的 在時間複雜度上還有很嚴重的問題,n為2位數時還好,大於100直接蹦掉了,希望有大牛給修正下。不過這個題也可以先算出來規律,然後一行 搞定 對於這種取法,除以7餘0或者除以7餘2時,先取的人都會輸,其他...

1000 合併石頭的最低成本

有n堆石頭排成一排,第i堆中有stones i 塊石頭。每次移動 move 需要將連續的k堆石頭合併為一堆,而這個移動的成本為這k堆石頭的總數。找出把所有石頭合併成一堆的最低成本。如果不可能,返回 1。示例 1 輸入 stones 3,2,4,1 k 2 輸出 20 解釋 從 3,2,4,1 開始。...