神秘样例一不过 WA42pts 赛时代码求调
查看原帖
神秘样例一不过 WA42pts 赛时代码求调
1036180
ChampionCyan楼主2025/7/30 10:11
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
int n, p1, p3, p5, pp;
string a, b;
int dp[2005][8];

/*
0 none
1 a p1
2 a p3
3 a p5
4 b p1
5 b p3
6 b p5
7 ab pp
*/

int mlst(int xl, int xr, int l = 0, int r = 7) {
    int res = 2e9;
    xl = max(xl, 0ll);
    for (int i = xl; i <= xr; i++)
        for (int j = l; j <= r; j++)
        res = min(res, dp[i][j]);
    return res;
}

signed main() {
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n >> a >> b;
    memset(dp, 0x3f, sizeof(dp));
    a = ' ' + a, b = ' ' + b;
    cin >> p1 >> p3 >> p5 >> pp;
    if (a[1] == '0' && b[1] == '0') {
        dp[1][0] = 0, dp[1][1] = dp[1][4] = p1, dp[1][2] = dp[1][5] = p3, dp[1][3] = dp[1][6] = p5, dp[1][7] = pp;
    } else if (a[1] == '0' && b[1] == '1') {
        dp[1][4] = p1;
        dp[1][5] = p3;
        dp[1][6] = p5;
        dp[1][7] = pp;
    } else if (a[1] == '1' && b[1] == '0') {
        dp[1][1] = p1;
        dp[1][2] = p3;
        dp[1][3] = p5;
        dp[1][7] = pp;
    } else {
        dp[1][7] = pp;
        dp[1][1] = dp[1][4] = p1 * 2;
        dp[1][2] = dp[1][5] = p3 * 2;
        dp[1][3] = dp[1][6] = p5 * 2;
    }
    //printf("%d ", mlst(1, 1));
    for (int i = 2; i <= n; i++) {
        int x = mlst(i - 1, i - 1);
        if (a[i] == '0' && b[i] == '0') {
            dp[i][0] = x, dp[i][1] = dp[i][4] = x + p1, dp[i][2] = dp[i][5] = x + p3, dp[i][3] = dp[i][6] = x + p5, dp[i][7] = x + pp;
        } else if (a[i] == '0' && b[i] == '1') {
            dp[i][0] = min({mlst(i - 2, i - 1, 5, 7), mlst(i - 3, i - 1, 6, 7), mlst(i - 4, i - 1, 6, 6)});
            dp[i][4] = x + p1;
            dp[i][5] = x + p3;
            dp[i][6] = x + p5;
            dp[i][7] = x + pp;
        } else if (a[i] == '1' && b[i] == '0') {
            dp[i][0] = min({mlst(i - 2, i - 1, 2, 3), mlst(i - 4, i - 1, 3, 3), mlst(i - 3, i - 1, 7, 7)});
            dp[i][1] = x + p1;
            dp[i][2] = x + p3;
            dp[i][3] = x + p5;
            dp[i][7] = x + pp;
        } else {
            dp[i][0] = min({mlst(i - 3, i - 1, 7, 7), mlst(i - 2, i - 2, 2, 3) + mlst(i - 2, i - 2, 5, 6), mlst(i - 4, i - 4, 3, 3) + mlst(i - 4, i - 4, 6, 6)});
            dp[i][7] = x + pp;
            dp[i][1] = dp[i][4] = x + p1 * 2;
            dp[i][2] = dp[i][5] = x + p3 * 2;
            dp[i][3] = dp[i][6] = x + p5 * 2;
        }
        //printf("%d ", mlst(1, 1));
    }
    cout << mlst(n, n) << '\n';
    return 0;
}

::::warning{open} 本代码并非骗分解而是全局解,至于样例不过代码还有 42pts 本人也是百思不得其解。 ::::

::::success[支持]{open} 调出壶关(当然是自愿的啦) ::::

2025/7/30 10:11
加载中...