二维转一维求调
查看原帖
二维转一维求调
576387
amlhdsan楼主2024/11/3 21:38

这是我的二维的代码,AC了

#include <bits/stdc++.h>

#define N 1000001

using namespace std;

int dp[N][3];
int a[N];
int n;
int ans;

int main() {

    cin >> n;

    for(int i = 1; i <= n; ++i) {
        cin >> a[i];
    } 

    for(int i = 1; i <= n; ++i) {
        dp[i][1] = dp[i][2] = dp[i][0] = 0x3f3f3f3f;
    } 

    dp[1][a[1] + 1] = 0;
    
    for(int i = 2; i <= n; ++i) {
        if(a[i] == -1) {
            dp[i][0] = dp[i - 1][0];
            if(a[i - 1] == 1) {
                dp[i][1] = min(dp[i - 1][0], dp[i - 1][1]) + 1;
            }
            if(a[i - 1] == 1) {
                dp[i][2] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 2;
            }
            else {
                dp[i][2] = dp[i - 1][2] + 2;
            }
        }
        else if(a[i] == 0) {
            dp[i][0] = dp[i - 1][0] + 1;
            dp[i][1] = min(dp[i - 1][0], dp[i - 1][1]);
            if(a[i - 1] == 1) {
                dp[i][2] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;
            }
            else {
                dp[i][2] = dp[i - 1][2] + 1;
            }
        }
        else {
            dp[i][0] = dp[i - 1][0] + 2;
            if(a[i - 1] == -1) {
                dp[i][1] = min(dp[i - 1][1], dp[i - 1][0]) + 1;
            }
            else {
                dp[i][1] = dp[i - 1][0] + 1;
            }
            dp[i][2] = min(dp[i - 1][1], min(dp[i - 1][2], dp[i - 1][0]));
        }
    }

    ans = min(dp[n][0], min(dp[n][1], dp[n][2]));
    if(ans >= 0x3f3f3f3f) {
        cout << "BRAK" << endl;
    }
    else {
        cout << ans << endl;
    }
    
    return 0;
}

那为什么我的滚动一维过不了啊?

#include <bits/stdc++.h>

using namespace std;

int dp[3];
int dp1[3];
int a, b;
int n;
int ans;

int main() {
    cin >> n;
    dp[1] = dp[2] = dp[0] = 0x3f3f3f3f;
    cin >> a;
    b = a;
    dp[a + 1] = 0;
    for(int i = 2; i <= n; ++i) {
        dp1[1] = dp[1];
        dp1[2] = dp[2];
        dp1[0] = dp[0];
        
        cin >> a;
        if(a == -1) {
            dp[0] = dp1[0];
            if(b == 1) {
                dp[1] = min(dp1[0], dp1[1]) + 1;
            }
            if(b == 1) {
                dp[2] = min(dp1[0], min(dp1[1], dp1[2])) + 2;
            }
            else {
                dp[2] = dp1[2] + 2;
            }
        }
        else if(a == 0) {
            dp[0] = dp1[0] + 1;
            dp[1] = min(dp1[0], dp1[1]);
            if(b == 1) {
                dp[2] = min(dp1[0], min(dp1[1], dp1[2])) + 1;
            }
            else {
                dp[2] = dp1[2] + 1;
            }
        }
        else {
            dp[0] = dp1[0] + 2;
            if(b == -1) {
                dp[1] = min(dp1[1], dp1[0]) + 1;
            }
            else {
                dp[1] = dp1[0] + 1;
            }
            dp[2] = min(dp1[1], min(dp1[2], dp1[0]));
        }
    }

    ans = min(dp[0], min(dp[1], dp[2]));
    if(ans >= 0x3f3f3f3f) {
        cout << "BRAK" << endl;
    }
    else {
        cout << ans << endl;
    }
    
    return 0;
}
2024/11/3 21:38
加载中...