126122024-12-26 20:32:18BucsMateFestés (50 pont)cpp17Accepted 50/50418ms19940 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 = 1; i <= N; i++){
        if(mask & (1 << (i-1))){
            dp[i] = dp[i-1];
        }
        for(int j = 0; j < i; j++){
            for(int k = 0; k <= j; k++){
                dp[i] = min(dp[i], dp[j] + col[k][i-1]);
            }
        }
    }
    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;
    cin >> N;
    return 0;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms320 KiB
2Accepted0/01ms332 KiB
3Accepted2/2247ms19936 KiB
4Accepted2/21ms320 KiB
5Accepted3/34ms568 KiB
6Accepted2/234ms2360 KiB
7Accepted2/2377ms19832 KiB
8Accepted2/2379ms19744 KiB
9Accepted2/2372ms19736 KiB
10Accepted2/2381ms19768 KiB
11Accepted2/2388ms19712 KiB
12Accepted2/2349ms18280 KiB
13Accepted2/2363ms18224 KiB
14Accepted2/2125ms19768 KiB
15Accepted3/3122ms19772 KiB
16Accepted3/3218ms19844 KiB
17Accepted2/2221ms19768 KiB
18Accepted3/3209ms19864 KiB
19Accepted2/2324ms17976 KiB
20Accepted2/2352ms19000 KiB
21Accepted2/2363ms19768 KiB
22Accepted2/2377ms19940 KiB
23Accepted2/2368ms19768 KiB
24Accepted2/2368ms19768 KiB
25Accepted2/2418ms19768 KiB