为什么
查看原帖
为什么
648508
zjx_kimi楼主2023/9/24 15:48
#include <bits/stdc++.h>
using namespace std;
int n, m, minn = 0x3f3f3f3f, maxn = -minn;
const int N = 105;
int num[N];
int sum[N];
int f[N][N][N];
int f2[N][N][N];
int dfs(int l, int r, int M) {
    if (f[l][r][M] != -1)
        return f[l][r][M];
    if (M == 1) {
        f[l][r][M] = (sum[r] - sum[l - 1] + 10) % 10;
        return f[l][r][M];
    }
    int res = 0x3f3f3f3f;
    for (int i = l; i < r; i++)
        for (int j = 1; j < M; j++)
            res = min(res, dfs(l, i, j) * dfs(i + 1, r, M - j));
    return f[l][r][M] = res;
}
int dfs2(int l, int r, int M) {
    if (f2[l][r][M] != -1)
        return f2[l][r][M];
    if (M == 1) {
        f2[l][r][M] = (sum[r] - sum[l - 1] + 10) % 10;
        return f2[l][r][M];
    }
    int res = 0;
    for (int i = l; i < r; i++)
        for (int j = 1; j < M; j++)
            res = max(res, dfs2(l, i, j) * dfs2(i + 1, r, M - j));
    return f2[l][r][M] = res;
}
int main() {
    memset(f, -1, sizeof f);
    memset(f2, -1, sizeof f2);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> num[i];
        if (num[i] < 0) num[i] += 1000;
        num[i] %= 10;
        num[i + n] = num[i];
    }
    for (int i = 1; i <= 2 * n; i++) {
        sum[i] = sum[i - 1] + num[i];
        sum[i] %= 10;
    }
    for (int i = 1; i <= n; i++) {
        minn = min(minn, dfs(i, i + n - 1, m));
        maxn = max(maxn, dfs2(i, i + n - 1, m));
    }
    cout << max(minn, 0LL) << '\n' << maxn; // 为什么要一个 0
    return 0;
}

2023/9/24 15:48
加载中...