84852024-01-17 20:16:10kukkermanFestés (50 pont)cpp17Elfogadva 50/50168ms28908 KiB
#include <iostream>
#include <array>
#include <vector>
#include <cstdint>
#include <limits>
#include <algorithm>

using SorKoltsegek = std::vector<uint64_t>;
using OszlopMatrix = std::array<std::array<uint64_t, 4>, 4>;
using OszlopKoltsegek = std::vector<OszlopMatrix>;

const auto U64MAX = std::numeric_limits<uint64_t>::max();

void beolvas(std::istream &be, SorKoltsegek &sor_koltsegek, OszlopKoltsegek &oszlop_koltsegek) {
    int n, m;
    be >> n >> m;

    sor_koltsegek.resize(n);
    for (auto &k : sor_koltsegek) {
        be >> k;
    }

    oszlop_koltsegek.resize(m);
    for (auto &o : oszlop_koltsegek) {
        for (int l = 0; l < n; l++) {
            for (int r = l; r < n; r++) {
                be >> o[l][r];
            }
        }
    }
}

// Az elozo javitott rekurziv megvalositason alapulo dinamikus programozas implementacio
uint64_t min_oszlop_koltseg_dp(int sorok_szama, size_t kifestett_sorok, const OszlopMatrix &o) {
    std::array<uint64_t, 5> dp { 0, U64MAX, U64MAX, U64MAX, U64MAX };
    for (auto utolso_sor = 0; utolso_sor < sorok_szama; utolso_sor++) {
        auto felso_min = U64MAX;
        for (auto also_kezd = utolso_sor; also_kezd >= 0; also_kezd--) {
            felso_min = std::min(felso_min, dp[also_kezd]);
            dp[utolso_sor + 1] = std::min(dp[utolso_sor + 1], felso_min + o[also_kezd][utolso_sor]);
        }

        if (kifestett_sorok & 1) {
            dp[utolso_sor + 1] = std::min(dp[utolso_sor + 1], dp[utolso_sor]);
        }
        kifestett_sorok >>= 1;
    }

    return dp[sorok_szama];
}

uint64_t feldolgoz(const SorKoltsegek &sor_koltsegek, const OszlopKoltsegek &oszlop_koltsegek) {
    // Sorok szama
    const auto n = sor_koltsegek.size();
    // Oszlopok szama
    const auto m = oszlop_koltsegek.size();
    // A sorok hatvanyhalmazanak szamossaga
    const auto max_sor_halmaz = 1 << n;

    auto min_koltseg = U64MAX;
    for (auto kifestett_sorok = 0u; kifestett_sorok < max_sor_halmaz; kifestett_sorok++) {
        uint64_t akt_koltseg = 0u;

        auto h = kifestett_sorok;
        int sor = 0;
        while (h) {
            akt_koltseg += (h & 1) * sor_koltsegek[sor++];
            h >>= 1;
        }

        for (const auto &o: oszlop_koltsegek) {
            akt_koltseg += min_oszlop_koltseg_dp(n, kifestett_sorok, o);
        }
        min_koltseg = std::min(min_koltseg, akt_koltseg);
    }

    return min_koltseg;
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    SorKoltsegek r;
    OszlopKoltsegek o;
    beolvas(std::cin, r, o);

    std::cout << feldolgoz(r, o) << std::endl;

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/03ms1824 KiB
2Elfogadva0/03ms2036 KiB
3Elfogadva2/294ms27236 KiB
4Elfogadva2/23ms2468 KiB
5Elfogadva3/34ms2800 KiB
6Elfogadva2/217ms5048 KiB
7Elfogadva2/2158ms27744 KiB
8Elfogadva2/2159ms27876 KiB
9Elfogadva2/2160ms27984 KiB
10Elfogadva2/2163ms28024 KiB
11Elfogadva2/2163ms28044 KiB
12Elfogadva2/2149ms26088 KiB
13Elfogadva2/2159ms26356 KiB
14Elfogadva2/250ms28504 KiB
15Elfogadva3/352ms28768 KiB
16Elfogadva3/389ms28596 KiB
17Elfogadva2/287ms28596 KiB
18Elfogadva3/389ms28592 KiB
19Elfogadva2/2145ms25992 KiB
20Elfogadva2/2153ms27160 KiB
21Elfogadva2/2159ms28204 KiB
22Elfogadva2/2162ms28720 KiB
23Elfogadva2/2160ms28824 KiB
24Elfogadva2/2162ms28908 KiB
25Elfogadva2/2168ms28908 KiB