区间型dp:
for (int i = 1; i <= n; ++i) scanf("%d", &w[i]);
for (int l = 1; l < n; ++l){
//枚举区间长度,隔板在右。
for (int i = 1; i + l <= n; ++i){
//枚举区间起点,满足i + l <= n
//区间右端点直接就是i + l
int j = i + l;
dp[i][j] = 0x3f3f3f3f;//初始化此区间
for (int k = i; k < j; ++k){
//隔板,从i的右边开始,j - 1的右边结束
//隔板把大区间划分成两个小区间,分别是[i, k]和[k + 1, j],再加上这样选择的价值。
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + w[i][j]);
}
}
}
CODEVS – 石子归并
http://codevs.cn/problem/1048/
#include<bits/stdc++.h>
using namespace std;
int w[105], n, dp[105][105];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &w[i]), w[i] += w[i - 1];
for (int l = 1; l