P4342求查错
查看原帖
P4342求查错
235696
muvum楼主2021/11/25 20:30

错了#2#3,真找不出来了……

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

const int MAXN = 100 + 5;

inline int max(int x, int y) {
    return x < y ? y : x;
}

inline int min(int x, int y) {
    return x < y ? x : y;
}

int n, num[MAXN], f[MAXN][MAXN], g[MAXN][MAXN];
char opt[MAXN];

int main() {
    std::ios::sync_with_stdio(false);

    std::cin >> n;
    for (int i=1; i<=n; ++i) {
        std::cin >> opt[i] >> num[i];
        opt[n+i] = opt[i]; num[n+i] = num[i];
    }
    memset(f, -1e9, sizeof(f));
    memset(g, 1e9, sizeof(g));
    for (int i=1; i<=2*n; ++i)
        f[i][i] = g[i][i] = num[i];
    for (int len=2; len<=n; ++len) {
        for (int i=1,j=len; j<=2*n; ++i,++j) {
            for (int k=i; k<j; ++k) {
                if (opt[k+1] == 't') {
                    f[i][j] = max(f[i][j], f[i][k] + f[k+1][j]);
                    g[i][j] = min(g[i][j], g[i][k] + g[k+1][j]);
                }
                if (opt[k+1] == 'x') {
                    f[i][j] = max(f[i][j], max(f[i][k] * f[k+1][j], max(g[i][k] * f[k+1][j], max(f[i][k] * g[k+1][j], g[i][k] * g[k+1][j]))));
                    g[i][j] = min(g[i][j], min(g[i][k] * g[k+1][j], min(f[i][k] * g[k+1][j], min(g[i][k] * f[k+1][j], f[i][k] * f[k+1][j]))));
                }
            }
        }
    }
    int ans = -1e9;
    for (int i=1; i<=n; ++i)
        ans = max(ans, f[i][i+n-1]);
    std::cout << ans << '\n';
    for (int i=1; i<=n; ++i)
        if (f[i][i+n-1] == ans)
            std::cout << i << ' ';
    std::cout << std::endl;

    return 0;
}
2021/11/25 20:30
加载中...