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