282 石子合并
作者:
Qiner
,
2024-12-20 21:09:35
,
所有人可见
,
阅读 8
区间dp : 循环求值之前要保证需要用到的dp值已知,故按区间长度从小到大循环
状态表示: dp[i][j] 将第i堆到第j堆的石子合并的最小代价
状态转移: 按最后一步合并的位置([l, k] [k + 1, r])划分
#include <iostream>
using namespace std;
const int NN = 310;
int N, dp[NN][NN];
int a[NN];
int main(){
cin >> N;
for (int i = 1; i <= N; i ++){
cin >> a[i];
a[i] += a[i - 1];
}
for (int len = 2; len <= N; len ++){
for (int i = 1, j; (j = i + len - 1) <= N; i ++){
dp[i][j] = 0x3f3f3f3f;
for (int k = i; k <= j - 1; k ++){
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + a[j] - a[i - 1]);
}
}
}
cout << dp[1][N];
return 0;
}