这个80pts
#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
const int maxm = 15;
int n, m;
int sum[maxn << 1], arr[maxn << 1];
int f[maxn << 1][maxn << 1][maxm];
int g[maxn << 1][maxn << 1][maxm];
inline int mod(int x) {
return (x % 10 + 10) % 10;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
arr[i + n] = arr[i];
}
for (int i = 1; i <= (n << 1); i++) {
sum[i] = sum[i - 1] + arr[i];
}
memset(g, 0x3f, sizeof(g));
for (int i = 1; i <= (n << 1); i++) {
for (int j = i; j <= (n << 1); j++) {
f[i][j][1] = mod(sum[j] - sum[i - 1]);
g[i][j][1] = mod(sum[j] - sum[i - 1]);
}
}
int maxv = 0, minv = 0x3f3f3f3f;
for (int part = 2; part <= m; part++) {
for (int i = 1; i <= (n << 1); i++) {
for (int j = i + part - 1; j <= (n << 1); j++) {
for (int k = i + part - 2; k < j; k++) {
f[i][j][part] = max(f[i][j][part], f[i][k][part - 1] * mod(sum[j] - sum[k]));
g[i][j][part] = min(g[i][j][part], g[i][k][part - 1] * mod(sum[j] - sum[k]));
if (part == m && (j - i + 1) == n) {
maxv = max(maxv, f[i][j][part]); // HERE
minv = min(minv, g[i][j][part]);
}
}
}
}
}
printf("%d\n%d", minv, maxv);
return 0;
}
这个100pts
#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
const int maxm = 15;
int n, m;
int sum[maxn << 1], arr[maxn << 1];
int f[maxn << 1][maxn << 1][maxm];
int g[maxn << 1][maxn << 1][maxm];
inline int mod(int x) {
return (x % 10 + 10) % 10;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
arr[i + n] = arr[i];
}
for (int i = 1; i <= (n << 1); i++) {
sum[i] = sum[i - 1] + arr[i];
}
memset(g, 0x3f, sizeof(g));
for (int i = 1; i <= (n << 1); i++) {
for (int j = i; j <= (n << 1); j++) {
f[i][j][1] = mod(sum[j] - sum[i - 1]);
g[i][j][1] = mod(sum[j] - sum[i - 1]);
}
}
int maxv = 0, minv = 0x3f3f3f3f;
for (int part = 2; part <= m; part++) {
for (int i = 1; i <= (n << 1); i++) {
for (int j = i + part - 1; j <= (n << 1); j++) {
for (int k = i + part - 2; k < j; k++) {
f[i][j][part] = max(f[i][j][part], f[i][k][part - 1] * mod(sum[j] - sum[k]));
g[i][j][part] = min(g[i][j][part], g[i][k][part - 1] * mod(sum[j] - sum[k]));
}
}
}
}
for (int i = 1; i <= n; i++) {
maxv = max(maxv, f[i][i + n - 1][m]); // HERE
minv = min(minv, g[i][i + n - 1][m]);
}
printf("%d\n%d", minv, maxv);
return 0;
}