输入样例:
4
1
1
1
1
输出样例:
8
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 410;
int n;
ll s[N];
ll f[N][N];
int main(){
cin >> n;
for(int i = 0; i < n; i++){
cin >> s[i];
s[i] += s[i - 1];
}
for(int len = 2; len <= n; len++){
for(int i = 0; i < n; i++){
int j = i + len - 1;
f[i][j] = 1e8;//将f[i][j]赋值最大,便于更新,如果是求最大得分则不用
for(int k = i; k < j; k++){
f[i][j] = min(f[i][k] + f[k + 1][j] + s[j] - s[i - 1], f[i][j]);//求最大值就把min换成max
}
}
}
cout << f[1][n];
return 0;
}
原题的空间范围上述代码过不了,但是,一般的石子合并问题足够解决。