題目鏈結
題意:給你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...