板子題
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 <= ai <= 10000)
output
輸出最小合併代價
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
const
int maxn=
1e5+5;
const
int onf=
-0x3f3f3f3f
;const
int inf=
0x3f3f3f3f
;int stone[
105]
;int sum[
105]
;int dp[
105]
[105];
int main (
)for
(int len=
1;len<=n;len++)}
}printf
("%d\n"
,dp[1]
[n])
;return0;
}rintf
("%d\n"
,dp[1]
[n])
;return0;
}
狀態轉移方程:
dp[start][finish]=min(dp[start][finish],dp[start][tmp]+dp[tmp+1][finish]+weight;
其中start是區間起點,tmp是分割點,finish是區間終點 區間dp(模板 例題)
參考博文 區間dp小結 附經典例題 首先,什麼是區間dp?它是幹什麼的?先在小區間進行dp得到最優解,然後再利用小區間的最優解合併求大區間的最優解 操作往往涉及到區間合併問題 以上。模板如下 mst dp,0 初始化dp陣列 for int i 1 i n i for int len 2 len n...
石子歸併(區間 dp 模板)
有n堆石子排成一排,其中第i堆的石子的重量為ai,現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆合併成新的一堆,形成的新石子堆的重量以及消耗的體力都是兩堆石子的重量之和。求把全部n堆石子合併成一堆最少需要消耗多少體力。include include include include inclu...
石子合併(區間DP模板)
設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...