#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18;
const int N = (1LL<<11);
void solve() {
int n;
cin >> n;
int f[n][n];
int cost[n][n];
for (int i = 0;i<n;i++) {
for (int j = 0;j<n;j++) {
cin >> cost[i][j];
}
}
for (int i = 0;i<n;i++) {
for (int j = 0;j<n;j++) f[i][j]= inf;
}
int lgs[n+1];
lgs[1] = 0;
for (int i=2;i<=n;i++) lgs[i] = lgs[i>>1]+1;
for (int le = n-1;le>=0;le--) {
for (int ri = le;ri < n;ri++) {
int len = ri-le+1;
if ((1<<lgs[len]) != len) continue;
if (le%len != 0) continue;
if (len == n) continue;
if (len == 1) {
f[le][ri] = 0;
continue;
}
if (len == 2) {
f[le][le+1] = f[le+1][le] = cost[le][le+1];
continue;
}
int mid = (le+ri) >> 1;
for (int r = ri;r >= mid+1;r--) {
for (int a = le;a <= mid;a++) {
int mn = inf;
for (int b = mid+1;b<=ri;b++) {
int chunk = (1<<lgs[b^r]+1);
if (chunk <= len/4 || b == r) {
continue;
}
mn = min(mn,cost[a][b]+f[b][r]);
}
for (int l = le;l<=mid;l++) {
int chunk = (1<<lgs[a^l]+1);
if (chunk <= len/4 || a == l) {
continue;
}
f[l][r] = min(f[l][r],f[l][a]+mn);
}
}
}
for (int l = le;l<=mid;l++) {
for (int r = mid+1;r<=ri;r++) {
f[r][l] = f[l][r];
}
}
}
}
int mn = inf;
vi mns(n+1),mns2(n+1);
for (int i = 0;i<n/2;i++) {
int mn1 = inf;
for (int j = 0;j<n/2;j++) {
int chunk = (1<<lgs[i^j]+1);
if (chunk <= n/4 || i == j) {
continue;
}
mn1 = min(mn1,f[j][i]);
}
mns[i] = mn1;
}
for (int i = n/2;i<n;i++) {
int mn2 = inf;
for (int j = n/2;j<n;j++) {
int chunk = (1<<lgs[i^j]+1);
if (chunk <= n/4 || i == j) {
continue;
}
mn2 = min(mn2,f[i][j]);
}
mns2[i] = mn2;
}
for (int i = 0;i<n/2;i++) {
for (int j = n/2;j<n;j++) {
mn = min(mn,mns[i]+mns2[j]+cost[i][j]);
}
}
cout << mn << '\n';
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0);
#ifdef Dodi
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int t = 1;
//cin >> t;
while (t --> 0) solve();
}
# | 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... |