9322 2024. 02. 20 13:38:19 Ablablabla Dinamit cpp17 Elfogadva 50/50 16ms 5480 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll INF = 4e15 + 7;


ll n, m, k;
vector<vector<ll>> magassagok;
vector<vector<vector<ll>>> dp;

ll megold(ll sor, ll oszlop, ll robbantas){
    //cout << "hivas: " << sor << " " << oszlop << " " << robbantas << "\n";
    if(sor < 0 || n <= sor || oszlop < 0 || n <= oszlop || robbantas < 0){
        return INF;
    }
    if(dp[sor][oszlop][robbantas] != INF){
        return dp[sor][oszlop][robbantas];
    }

    ll vissza = INF;
    int mag = magassagok[sor][oszlop];

    for(ll i = 0; i <= robbantas; i++){
        ll jobbra = megold(sor, oszlop + 1, robbantas - i);
        ll lefele = megold(sor + 1, oszlop, robbantas - i);

        vissza = min(vissza, min(jobbra, lefele) + mag);
        mag /= 2;
    }

    dp[sor][oszlop][robbantas] = vissza;
    return vissza;
}

ll leker(int sor, int oszlop, int robbantas){
    if(sor < 0 || n <= sor || oszlop < 0 || m <= oszlop || robbantas < 0 || k < robbantas){
        return INF;
    }

    return dp[sor][oszlop][robbantas];
}

int main(){
    cin >> n >> m >> k;

    magassagok.assign(n, vector<ll>(m, 0));
    dp.assign(n, vector<vector<ll>>(m, vector<ll>(k + 1, INF))); // sor, oszlop, robbantas

    for(ll robbantas = 0; robbantas < n; robbantas++){
        for(ll sor = 0; sor < m; sor++){
            cin >> magassagok[robbantas][sor];
        }
    }

    dp[n - 1][m - 1][0] = magassagok[n - 1][m - 1];
    for(ll robbantas = 1; robbantas <= k; robbantas++){
        dp[n - 1][m - 1][robbantas] = dp[n - 1][m - 1][robbantas - 1] / 2;
    }

    for(int robbantas = 0; robbantas <= k; robbantas++){
        for(int sor = n - 1; sor >= 0; sor--){
            for(int oszlop = m - 1; oszlop >= 0; oszlop--){
                if(sor == n - 1 && oszlop == m - 1) continue;

                ll mag = magassagok[sor][oszlop];
                ll vissza = INF;

                for(ll i = 0; i <= robbantas; i++){
                    ll jobbra = leker(sor, oszlop + 1, robbantas - i);
                    ll lefele = leker(sor + 1, oszlop, robbantas - i);

                    vissza = min(vissza, min(jobbra, lefele) + mag);
                    mag /= 2;
                }

                dp[sor][oszlop][robbantas] = vissza;

                //cout << j << " " << l << " " << i << " : " << a << " " << b << " " << c << " " << d << " " << e << "\n";
            }
        }
    }

    cout << dp[0][0][k] << "\n";

    //cout << megold(0, 0, k) << "\n";

    /*for(ll i = 0; i <= k; i++){
        for(ll j = 0; j < n; j++){
            for(ll l = 0; l < m; l++){
                if(dp[j][l][i] == INF){
                    cout << "-1\t";
                    continue;
                }
                cout << dp[j][l][i] << "\t";
            }
            cout << "\n";
        }
        cout << "\n\n";
    }*/
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1816 KiB
2 Elfogadva 0/0 16ms 3208 KiB
3 Elfogadva 2/2 3ms 2464 KiB
4 Elfogadva 2/2 3ms 2428 KiB
5 Elfogadva 3/3 4ms 2704 KiB
6 Elfogadva 3/3 3ms 2840 KiB
7 Elfogadva 2/2 14ms 4036 KiB
8 Elfogadva 3/3 16ms 4268 KiB
9 Elfogadva 2/2 3ms 3424 KiB
10 Elfogadva 2/2 4ms 3760 KiB
11 Elfogadva 3/3 3ms 3980 KiB
12 Elfogadva 3/3 3ms 3816 KiB
13 Elfogadva 2/2 6ms 4056 KiB
14 Elfogadva 3/3 6ms 4068 KiB
15 Elfogadva 2/2 16ms 4860 KiB
16 Elfogadva 3/3 16ms 5132 KiB
17 Elfogadva 2/2 16ms 5240 KiB
18 Elfogadva 3/3 16ms 5248 KiB
19 Elfogadva 2/2 16ms 5480 KiB
20 Elfogadva 3/3 16ms 5412 KiB
21 Elfogadva 2/2 16ms 5452 KiB
22 Elfogadva 3/3 16ms 5432 KiB