137262025-01-08 14:23:33AblablablaFestés (50 pont)cpp17Elfogadva 50/50467ms35636 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++){
        //cout << n << " " << m - 1 << "\n";
        dp[n][m - 1] = 0;
        for(ll j = m - 1; j >= 0; j--){
            if(j != m - 1){
                //cout << n << " " << j << "\n";
                dp[n][j] = dp[0][j + 1];
            }

            for(ll i = n - 1; i >= 0; i--){
                dp[i][j] = INF;

                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]);
                }
            }
        }

        /*cout << "\n";
        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";
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/01ms500 KiB
2Elfogadva0/01ms316 KiB
3Elfogadva2/2259ms22324 KiB
4Elfogadva2/21ms316 KiB
5Elfogadva3/34ms564 KiB
6Elfogadva2/237ms3892 KiB
7Elfogadva2/2409ms35416 KiB
8Elfogadva2/2425ms35588 KiB
9Elfogadva2/2428ms35616 KiB
10Elfogadva2/2407ms35552 KiB
11Elfogadva2/2409ms35340 KiB
12Elfogadva2/2391ms32564 KiB
13Elfogadva2/2412ms32564 KiB
14Elfogadva2/2130ms16692 KiB
15Elfogadva3/3133ms16812 KiB
16Elfogadva3/3231ms22108 KiB
17Elfogadva2/2240ms22324 KiB
18Elfogadva3/3237ms22324 KiB
19Elfogadva2/2344ms32068 KiB
20Elfogadva2/2375ms33836 KiB
21Elfogadva2/2416ms35304 KiB
22Elfogadva2/2426ms35636 KiB
23Elfogadva2/2398ms35636 KiB
24Elfogadva2/2388ms35596 KiB
25Elfogadva2/2467ms35636 KiB