137152025-01-08 13:37:34AblablablaFestés (50 pont)cpp17Wrong answer 8/50458ms35640 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll INF = 4e18 + 7;

int main(){
    ll n, m;
    cin >> n >> m;

    ll ans = 0;
    vector<ll> sor(n);
    for(ll &x : sor){
        cin >> x;
        ans += x;
    }

    vector<vector<vector<ll>>> oszlop(n, vector<vector<ll>>(m, vector<ll>(n, INF)));
    for(ll j = 0; j < m; j++){
        for(ll i = 0; i < n; i++){
            for(ll k = i; k < n; k++){
                cin >> oszlop[i][j][k];
            }
        }
    }

    for(ll j = 0; j < m; j++){
        for(ll i = 0; i < n; i++){
            for(ll k = n - 1; k >= i; k--){
                ll a = INF, b = INF;

                if(0 <= i - 1) a = oszlop[i - 1][j][k];

                if(k + 1 < n) b = oszlop[i][j][k + 1];

                oszlop[i][j][k] = min(oszlop[i][j][k], min(a, b));
            }
        }
    }

    /*for(int j = 0; j < m; j++){
        for(int i = 0; i < n; i++){
            for(int k = 0; k < n; k++){
                cout << oszlop[i][j][k] << " ";
            }
            cout << "\n";
        }
        cout << "\n";
    }*/

    vector<vector<ll>> dp(n + 1, vector<ll>(m, INF));

    for(ll mask = 0; mask < (1 << n); mask++){
        dp[n][m - 1] = 0;
        for(ll j = m - 1; j >= 0; j--){
            if(j != m - 1){
                dp[n][j] = dp[0][j + 1];
            }

            for(ll i = n - 1; i >= 0; i--){

                if(mask & (1 << i)){
                    dp[i][j] = min(dp[i][j], dp[i + 1][j]);
                }

                for(ll k = i; k < n; k++){
                    dp[i][j] = min(dp[i][j], dp[k + 1][j] + oszlop[i][j][k]);
                }
            }
        }

        /*for(int i = 0; i <= n; i++){
            for(int j = 0; j < m; j++){
                cout << dp[i][j] << " ";
            }
            cout << "\n";
        }
        cout << "\n";*/

        ll plusz = 0;
        for(ll i = 0; i < n; i++){
            if(mask & (1 << i)){
                plusz += sor[i];
            }
        }

        //cout << mask << " " << dp[0][0] + plusz << "\n";

        /*for(auto x : dp){
            for(ll y : x){
                cout << y << " ";
            }
            cout << "\n";
        }*/

        ans = min(ans, dp[0][0] + plusz);
    }

    cout << ans << "\n";
}
SubtaskSumTestVerdictTimeMemory
base8/50
1Accepted0/01ms508 KiB
2Accepted0/01ms316 KiB
3Wrong answer0/2273ms22324 KiB
4Wrong answer0/21ms316 KiB
5Wrong answer0/34ms564 KiB
6Wrong answer0/237ms3820 KiB
7Accepted2/2442ms35640 KiB
8Accepted2/2416ms35432 KiB
9Wrong answer0/2421ms35488 KiB
10Wrong answer0/2437ms35636 KiB
11Wrong answer0/2421ms35380 KiB
12Wrong answer0/2402ms32564 KiB
13Wrong answer0/2405ms32564 KiB
14Accepted2/2138ms16692 KiB
15Wrong answer0/3141ms16692 KiB
16Wrong answer0/3239ms22308 KiB
17Wrong answer0/2243ms22292 KiB
18Wrong answer0/3244ms22172 KiB
19Wrong answer0/2375ms32052 KiB
20Wrong answer0/2391ms33836 KiB
21Wrong answer0/2412ms35264 KiB
22Wrong answer0/2435ms35440 KiB
23Accepted2/2432ms35636 KiB
24Wrong answer0/2405ms35636 KiB
25Wrong answer0/2458ms35636 KiB