51nod 1021 石子歸併 基礎dp

2021-07-31 21:41:59 字數 933 閱讀 7167

假設有n堆石子,要把石子有次序的兩兩合併,要求代價最小。假設1~n之間有一k,把石子分為1~k和k~n兩部分,劃分後的這兩部分再繼續這樣劃分,直到不能劃分,然後就開始分別合併,求出合併後的最小代價,即cost[1~n]=min,用記憶化搜尋還是比較好寫的。

#include 

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

const

int maxn = 110;

int num[maxn];

int sum[maxn];

int n;

int dp[maxn][maxn];

int dfs(int l, int r)

int main()

int res = dfs(1,n);

printf("%d\n",res);

return

0;}

用迴圈寫:

#include 

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

const

int maxn = 110;

int dp[maxn][maxn];

int num[maxn],sum[maxn];

int n;

int main()

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

}cout

<< dp[1][n] << endl;

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 石子歸併

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

51nod 1021 石子歸併

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