51Nod 1021 石子歸併 區間dp

2021-08-19 22:47:33 字數 2211 閱讀 9384

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堆石子的數量,計算最小合併代價。

第1行:n(2 <= n <= 100)

第2 - n + 1:n堆石子的數量(1 <= a[i] <= 10000)

輸出最小合併代價

input示例41

234output示例

19

入門題目

#pragma comment(linker, "/stack:1024000000,1024000000")

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ls st<<1

#define rs st<<1|1

#define fst first

#define snd second

#define mp make_pair

#define pb push_back

#define ll long long

#define pii pair

#define vi vector

#define clr(a,b) memset(a, (b), sizeof(a))

#define all(x) x.begin(),x.end()

#define ber(i,s,e) for(int i=(s); i<=(e); i++)

#define rep(i,s,e) for(int i=(s); i>=(e); i--)

const

int inf = 0x3f3f3f3f;

const

int maxn = 1e2+10;

const

int mod = 1e9+7;

const

double eps = 1e-8;

void fe()

ll read()

while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();

return x*f;}/*

區間dp 顧名思義,就是在一段區間內進行的動態規劃

dp[i][j] i表示起始位置,j表示終止位置,

該定義乙個陣列dp[i,j]用來表示合併方法,i表示從編號為i的石頭開始合併,

j表示所求區間的結尾,sum表示的是石頭的數量。

*/int dp[maxn][maxn], sum[maxn][maxn];

int arr[maxn];

int n;

int main()

clr(dp,inf);

for(int i = 1; i <= n; i++)

// len為長度從小到大 i表示開始的位置 j表示結束的位置

for(int len = 1; len < n; len++) }}

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,有不少...