两个WA求调
查看原帖
两个WA求调
521302
landernal楼主2022/8/4 10:53
#include <iostream>
#include <cstring>
//#include <cstdio>
#define inf 0x3f3f3f3f
#define dppa dp_min[begin][end][part]
#define dppi dp_max[begin][end][part]
using namespace std;
int arr[55], n, m, sum[130];
int dp_min[130][130][130], dp_max[130][130][130];
int mod10(int x) {
    if(x < 0) {
        x %= 10;
        return x + 10;
    }
    return x % 10;
}
int dfs_min(int begin, int end, int part){
    if(dppi != inf) {
        return dppi;
    }
    if(part == 1) {
        return dppi = mod10(sum[end] - sum[begin - 1]);
    }
    int ans = inf;
    for(int i = begin; i < end; i++) {
        for(int j = 1; j < part; j++) {
            if(i - begin + 1 < j || end - i + 2 < part - j) {
                continue;
            }
            ans = min(ans, dfs_min(begin, i, j) * dfs_min(i + 1, end, part - j));
        }
    }
    dppi = ans;
    return ans;
}
int dfs_max(int begin, int end, int part){
    if(dppa != inf) {
        return dppa;
    }
    if(part == 1) {
        return dppa = mod10(sum[end] - sum[begin - 1]);
    }
    int ans = -1;
    for(int i = begin; i < end; i++) {
        for(int j = 1; j < part; j++) {
            if(i - begin + 1 < j || end - i < part - j) {
                continue;
            }
            ans = max(ans, dfs_max(begin, i, j) * dfs_max(i + 1, end, part - j));
        }
    }
    dppa = ans;
    return ans;
}
int main(){
    memset(dp_min, 0x3f, sizeof(dp_min));
    memset(dp_max, 0x3f, sizeof(dp_max));
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        cin >> arr[i];
        sum[i] = sum[i - 1]+ arr[i];
    }
    for(int i = 1; i <= n - 1; i++) {
        sum[n + i] = sum[n + i - 1] + arr[i];
    }
    int ansin = inf, ansax = -1;
    for(int i = 1; i <= n; i++) {
        ansin = min(ansin, dfs_min(i, n + i - 1, m));
        ansax = max(ansax, dfs_max(i, n + i - 1, m));
    }
    cout << ansin << endl << ansax << endl;
    return 0;
}

2022/8/4 10:53
加载中...