區間dp模板

2021-10-01 22:45:21 字數 1368 閱讀 7476

板子題

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