1021 石子歸併

2021-09-11 00:20:23 字數 963 閱讀 5972

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堆石子的數量,計算最小合併代價。

收起

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

第2 - n + 1:n堆石子的數量(1 <= a[i] <= 10000)

輸出最小合併代價
412

34

19
本想用貪心來做,但是貪心排序的 次數有些多,然後dp來寫的話就需要動態轉移方程, dp[x][y]=min(dp[x][y],dp[x][j]+dp[j+1][y]+sum[y]-sum[x-1]);

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int n;

int a[1010],sum[1010];

int dp[1010][1010];

int main()

int ans = 0;

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

x--;}}

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

return 0;

}

1021 石子歸併 dp

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...

1021 石子歸併 區間DP

思路 這題是道經典題,真的很有意思,才學dp學詳細點吧!應該算上乙個區間的dp,在寫dp的時候我覺得不僅僅只想狀態轉移方程,更要確定i j dp i j 等各個狀態參量的實際意義,否則dp方程是無法確定的。一開始想的是按照數塔階段性轉移,i表示第幾次合併,j表示合併第幾個,但是並不行。實際解題步驟 ...

1021 石子歸併 區間dp

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