156292025-02-21 11:33:13GervidDinamitcpp17Accepted 50/5043ms1016 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <array>
#include <fstream>

using namespace std;
using ll = long long;

signed main()
{
	iostream::sync_with_stdio(0);
	cin.tie(0);

	ll n, m, k, i, j, l, l2;
	cin >> n >> m >> k;

	vector<vector<ll>> grid(n, vector<ll>(m));
	vector<vector<vector<ll>>> dp(n, vector<vector<ll>>(m, vector<ll>(k+1, LLONG_MAX)));
	for (i = 0; i < n; i++)
		for (j = 0; j < m; j++)
			cin >> grid[i][j];

	for (i = 0; i <= k; i++) dp[0][0][i] = grid[0][0] / (1LL << min(62LL, i));

	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			for (l = 0; l <= k; l++)
			{
				for (l2 = 0; l2 <= l; l2++)
				{
					if ((i != 0) && (j == 0 || dp[i - 1][j][l] < dp[i][j - 1][l-l2]))
					{
						if (dp[i][j][l] > grid[i][j] / (1LL << min(62LL, l2)) + dp[i - 1][j][l - l2])
						{
							dp[i][j][l] = grid[i][j] / (1LL << min(62LL, l2)) + dp[i - 1][j][l - l2];
						}
					}
					if ((j != 0) && (i == 0 || dp[i][j - 1][l] <= dp[i - 1][j][l-l2]))
					{
						if (dp[i][j][l] > grid[i][j] / (1LL << min(62LL, l2)) + dp[i][j - 1][l - l2])
						{
							dp[i][j][l] = grid[i][j] / (1LL << min(62LL, l2)) + dp[i][j - 1][l - l2];
						}
					}
				}
			}
		}
	}
	cout << dp[n-1][m-1][k];
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms508 KiB
2Accepted0/043ms820 KiB
3Accepted2/21ms508 KiB
4Accepted2/21ms316 KiB
5Accepted3/31ms316 KiB
6Accepted3/31ms316 KiB
7Accepted2/239ms1016 KiB
8Accepted3/341ms1012 KiB
9Accepted2/23ms316 KiB
10Accepted2/23ms316 KiB
11Accepted3/34ms316 KiB
12Accepted3/33ms508 KiB
13Accepted2/210ms564 KiB
14Accepted3/310ms576 KiB
15Accepted2/243ms820 KiB
16Accepted3/343ms1012 KiB
17Accepted2/243ms820 KiB
18Accepted3/343ms820 KiB
19Accepted2/243ms824 KiB
20Accepted3/343ms820 KiB
21Accepted2/243ms820 KiB
22Accepted3/343ms820 KiB