#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using pint = array <int, 2>;
using fint = array <int, 5>;
const int INF = 1e9;
int n, ntot, na, nb, k, ans = 0;
int dp[9][1 << 20], AisC[1 << 20], val[2001][2001], adj[51][51];
int vst[30];
LL sval = 0;
vector <fint> domino;
vector <int> A, B, curB;
void dfs(int mask, int sum){
if (!curB.empty()){
sum += B[curB.back()];
for (int i = 0; i < na; i++){
if (!adj[i][curB.back() + na] && (mask & (1 << i))) mask ^= (1 << i);
}
}
ans = max(ans, sum + dp[k - (int) curB.size()][mask]);
if ((int) curB.size() == k) return;
if (curB.empty()){
for (int i = 0; i < nb; i++){
curB.push_back(i);
dfs(mask, sum);
curB.pop_back();
}
}
else {
for (int i = curB.back() + 1; i < nb; i++){
int flag = 1;
for (int elm : curB) if (!adj[i + na][elm + na]) flag = 0;
if (flag){
curB.push_back(i);
dfs(mask, sum);
curB.pop_back();
}
}
}
}
int main()
{
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) {
scanf("%d", &val[i][j]);
sval += val[i][j];
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (i >= 2) domino.push_back({val[i][j] + val[i - 1][j], i, j, i - 1, j});
if (j >= 2) domino.push_back({val[i][j] + val[i][j - 1], i, j, i, j - 1});
}
}
sort(domino.begin(), domino.end());
reverse(domino.begin(), domino.end());
ntot = 7 * k - 6;
na = min(20, ntot);
nb = ntot - na;
for (int i = 0; i < na; i++) A.push_back(domino[i][0]);
for (int i = na; i < ntot; i++) B.push_back(domino[i][0]);
for (int i = 0; i < ntot; i++){
for (int j = 0; j < ntot; j++){
if (i == j) continue;
if ((pint) {domino[i][1], domino[i][2]} == (pint){domino[j][1], domino[j][2]} ||
(pint){domino[i][1], domino[i][2]} == (pint){domino[j][3], domino[j][4]} ||
(pint){domino[i][3], domino[i][4]} == (pint){domino[j][1], domino[j][2]} ||
(pint){domino[i][3], domino[i][4]} == (pint){domino[j][3], domino[j][4]}) continue;
adj[i][j] = 1;
}
}
AisC[0] = 1;
for (int mask = 0; mask < (1 << na); mask++){
if (!AisC[mask]) continue;
for (int i = 0; i < na; i++){
if (mask & (1 << i)) continue;
int flag = 1;
for (int j = 0; j < na; j++) if ((mask & (1 << j)) && !adj[i][j]) flag = 0;
if (flag) AisC[mask | (1 << i)] = 1;
}
}
for (int d = 0; d <= k; d++){
for (int mask = 0; mask < (1 << na); mask++) dp[d][mask] = -INF;
for (int mask = 0; mask < (1 << na); mask++){
if (__builtin_popcount(mask) == d && AisC[mask]){
int sum = 0;
for (int i = 0; i < na; i++) if (mask & (1 << i)) sum += A[i];
dp[d][mask] = max(dp[d][mask], sum);
}
for (int i = 0; i < na; i++) dp[d][mask | (1 << i)] = max(dp[d][mask | (1 << i)], dp[d][mask]);
}
}
dfs((1 << na) - 1, 0);
printf("%lld\n", sval - ans);
return 0;
}
Compilation message (stderr)
domino.cpp: In function 'int main()':
domino.cpp:45:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
45 | scanf("%d %d", &n, &k);
| ~~~~~^~~~~~~~~~~~~~~~~
domino.cpp:47:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
47 | scanf("%d", &val[i][j]);
| ~~~~~^~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |