原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021
思路:简单的区间DP,预处理前缀和就好
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e2 + 5;
const int MOD = 1e9 + 7;
long long a[MAXN], dp[MAXN][MAXN], sum[MAXN];
int main() {
int n;
scanf("%d", &n);
sum[0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
for (int l = 2; l <= n; l++) {
for (int i = 1; i + l - 1 <= n; i++) {
int j = i + l - 1;
dp[i][j] = 0x3f3f3f3f;
for (int k = i; k < j; k++) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] - sum[i - 1] + sum[j]);
}
}
}
printf("%lld\n", dp[1][n]);
return 0;
}