石子歸併 51Nod 1021

2021-08-22 03:23:50 字數 1105 閱讀 3259

n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。

例如: 1 2 3 4,有不少合併方法

1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)

1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)

1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)

括號裡面為總代價可以看出,第一種方法的代價最低,現在給出n堆石子的數量,計算最小合併代價。

input

第1行:n(2 <= n <= 100)

第2 - n + 1:n堆石子的數量(1 <= aii <= 10000)

output

輸出最小合併代價

sample input

4 1

2 3

4sample output

19題以分析:這道題是今天寫的第三道動態規劃類題型了,這到題屬於最優問題,最優問題一般分解為兩個最優的合成乙個最優的,這就和動態規劃的思想一致了,有前乙個狀態得到下乙個狀態,可以想到這裡,然後就應該很簡單的退出來狀態轉移方程了吧。

dp[i][j] 的意思是i堆到j堆的最少花費的合併。

arr【i】表示前i堆的石子的總個數。

狀態轉移方程:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + arr[j] - arr[i-1]);

#include 

#include

#include

#include

#include

#define ll long long

using

namespace

std;

void demo(int dp[110], int *arr, int n)}}

}int main()

demo(dp, arr, n);

printf("%d\n", dp[1][n]);

return

0;}

石子歸併 51Nod 1021

n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少合併方法 1 2 3 4 3 3 4 3 6 4 9 10 19 1 2 3 4 1 5 4 5 1 9...

51nod 1021 石子歸併

n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少合併方法 1 2 3 4 3 3 4 3 6 4 9 10 19 1 2 3 4 1 5 4 5 1 9...

51nod 1021 石子歸併

1021 石子歸併 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少...