51nod 石子歸併

2021-10-09 17:00:52 字數 811 閱讀 1246

題目鏈結

題意:給你n個石子 每次可以合併相鄰的兩個石子 消耗為兩個石子的和 求最小的消耗

思路 :

dp[i][j] 表示重i到j的合併的最小權值和

sum[i][j] 表示 i到j的和

pre[i]表示1到i的字首和

每次先將所有的2個石子合併 然後是3個石子合併(等價於2個石子加上1個石子的合併)依次類推4個,5個到n個

轉移方程 dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]+sum[i][j])

#include

#include

#include

using

namespace std;

const

int maxn =

1005

;const

int inf =

0x3f3f3f3f

;int a[maxn]

;int dp[maxn]

[maxn]

;int sum[maxn]

[maxn]

;int pre[maxn]

;int

main()

for(

int i=

1; i<=n;

++i)

}for

(int i=

1;i<=n;

++i)}}

printf

("%d\n"

, dp[1]

[n])

;return0;

}

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

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