竟然读错题了,要按顺序分堆
二维DP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#define MOD ((int)(1e9) + 7)
#define eps 1e-10
#define maxn 100
typedef long long ll;
using namespace std;
int main() {
int t, a[100], dp[100][100], sum[100];
scanf("%d", &t);
while (t --) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i <= m; ++ i) {
for (int j = 0; j <= n; ++ j) {
dp[i][j] = 1;
}
}
for (int i = 1; i <= n; ++ i) {
scanf("%d", &a[i]);
}
sum[0] = 0;
for (int i = 1; i <= n; ++ i) {
sum[i] = sum[i-1] + a[i];
}
for (int i = 1; i <= m; ++ i) {
for (int j = 1; j <= n; ++ j) {
for (int k = i-1; k < j; ++ k) {
dp[i][j] = max(dp[i][j], dp[i-1][k]*(sum[j]-sum[k]));
}
}
}
cout << dp[m][n] << endl;
}
}
滚动数组
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#define MOD ((int)(1e9) + 7)
#define eps 1e-10
#define maxn 100
typedef long long ll;
using namespace std;
int main() {
int t, a[100], dp[100], sum[100];
scanf("%d", &t);
while (t --) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i <= n; ++ i) dp[i] = 1;
for (int i = 1; i <= n; ++ i) {
scanf("%d", &a[i]);
}
sum[0] = 0;
for (int i = 1; i <= n; ++ i) {
sum[i] = sum[i-1] + a[i];
}
for (int i = 1; i <= m; ++ i) {
for (int j = n; j >= 0; -- j) {
dp[j] = 1;
for (int k = i-1; k < j; ++ k) {
dp[j] = max(dp[j], dp[k]*(sum[j]-sum[k]));
}
}
}
cout << dp[n] << endl;
}
}