# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
106220 | SecretAgent007 | Wiring (IOI17_wiring) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "wiring.h"
using namespace std;
#define int long long
vector< vector< int > > memo;
int dp(int n, int m, vector< int > &red, vector< int > &blue){
if(n < 0 || m < 0){
return INT_MAX;
}
if(n == 0 && m == 0){
return memo[n][m] = abs(red[n]-blue[m]);
}
if(memo[n][m] != -1) return memo[n][m];
return memo[n][m] = min(dp(n-1, m-1, red, blue), min(dp(n-1,m,red, blue), dp(n,m-1,red,blue))) + abs(red[n]-blue[m]);
}
long long min_total_length (vector <int> red, vector <int> blue) {
int n = red.size();
int m = blue.size();
if(n < 500 && m < 500){
memo.resize(n, vector<int>(m));
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
memo[i][j] = -1;
}
}
return dp(n-1,m-1,red,blue);
}
int tot = 0;
int f = 0;
int s = 0;
while(f < n && s < m){
tot += blue[s]-red[f];
s++;
f++;
}
while(f < n){
tot += blue[0]-red[f];
f++;
}
while(s < m){
tot += blue[s]-red.back();
s++;
}
return tot;
}
/*
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
vector< int > red(n);
vector< int > blue(m);
for(int i = 0; i < n; i++){
cin >> red[i];
}
for(int i = 0; i < m; i++){
cin >> blue[i];
}
cout << min_total_length(red, blue) << endl;
}*/