#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MAXN (100+10)
int sum[MAXN];
int dp[MAXN][MAXN];
#define min(u,v) (u<v?u:v)
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++)
scanf("%d", &sum[i]);
for(int i = 1; i <= n; i ++)
sum[i] += sum[i-1];
memset(dp,63,sizeof(dp));
for(int i = 1; i <= n; i ++) dp[i][i] = 0;
for(int i = n-1; i >= 1; i --)
for(int j = i+1; j <= n; j ++)
for(int k = i; k <= j; k ++)
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
cout << dp[1][n] << endl;
return 0;
}
Codevs 1048 石子归并 区间DP
最新推荐文章于 2021-05-12 16:43:59 发布