做如下兩個模型的石子合併,如下模型石子都不能移動出列,且合併都僅發生在相鄰兩堆石子中:(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 開始。...