126132024-12-26 20:33:56BucsMateFestés (50 pont)cpp17Accepted 50/50404ms19968 KiB
#include <iostream>
#include <climits>

using namespace std;

const long long INF = LLONG_MAX;

long long calc_col(int N, long long col[5][5], int mask)
{
    long long dp[5] = {0, INF, INF, INF, INF};
    for(int i = 0; i < N; i++){
        if(mask & (1 << i)){
            dp[i+1] = dp[i];
        }
        for(int j = 0; j <= i; j++){
            for(int k = 0; k <= j; k++){
                dp[i+1] = min(dp[i+1], dp[j] + col[k][i]);
            }
        }
    }
    return dp[N];
}

int main()
{
    int N, M;
    cin >> N >> M;
    long long row[5];
    for(int i = 0; i < N; i++){
        cin >> row[i];
    }
    long long col[100001][5][5];
    for(int i = 0; i < M; i++){
        for(int j = 0; j < N; j++){
            for(int k = j; k < N; k++){
                cin >> col[i][j][k];
            }
        }
    }
    long long res = INF;
    for(int mask = 0; mask < (1 << N); mask++){
        long long curr = 0;
        for(int i = 0; i < N; i++){
            if(mask & (1 << i)){
                curr += row[i];
            }
        }
        for(int i = 0; i < M; i++){
            curr += calc_col(N, col[i], mask);
        }
        res = min(res, curr);
    }
    cout << res << endl;
    return 0;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms320 KiB
2Accepted0/01ms320 KiB
3Accepted2/2238ms19768 KiB
4Accepted2/21ms320 KiB
5Accepted3/34ms568 KiB
6Accepted2/232ms2364 KiB
7Accepted2/2361ms19764 KiB
8Accepted2/2367ms19740 KiB
9Accepted2/2358ms19768 KiB
10Accepted2/2368ms19768 KiB
11Accepted2/2361ms19768 KiB
12Accepted2/2338ms18232 KiB
13Accepted2/2351ms18232 KiB
14Accepted2/2119ms19768 KiB
15Accepted3/3122ms19816 KiB
16Accepted3/3208ms19768 KiB
17Accepted2/2201ms19968 KiB
18Accepted3/3197ms19772 KiB
19Accepted2/2316ms17976 KiB
20Accepted2/2340ms19000 KiB
21Accepted2/2351ms19764 KiB
22Accepted2/2365ms19772 KiB
23Accepted2/2363ms19768 KiB
24Accepted2/2356ms19768 KiB
25Accepted2/2404ms19772 KiB