✅ 插头动态规划
This commit is contained in:
parent
4e3b93b7c2
commit
89365408c7
32
fastest-way2unified-data/main.cc
Normal file
32
fastest-way2unified-data/main.cc
Normal file
@ -0,0 +1,32 @@
|
||||
#include <climits>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <set>
|
||||
using namespace std;
|
||||
int main() {
|
||||
int n, k;
|
||||
cin >> n >> k;
|
||||
int arr[n];
|
||||
for (int i = 0; i < n; i++)
|
||||
cin >> arr[i];
|
||||
multiset<int> m;
|
||||
int result = INT_MAX;
|
||||
for (int i = 0; i < n - k + 1; i++) {
|
||||
if (i == 0) {
|
||||
for (int j = i; j <= i + k - 1; j++)
|
||||
m.insert(arr[j]);
|
||||
} else {
|
||||
m.erase(arr[i - 1]);
|
||||
m.insert(arr[i + k - 1]);
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
auto middle_ptr = m.begin();
|
||||
advance(middle_ptr, m.size() / 2);
|
||||
for (const auto &element : m) {
|
||||
count += abs(element - *middle_ptr);
|
||||
}
|
||||
result = min(result, count);
|
||||
}
|
||||
printf("%d\n", result);
|
||||
}
|
156
plug-dp/main.cc
Normal file
156
plug-dp/main.cc
Normal file
@ -0,0 +1,156 @@
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#define ll long long
|
||||
#define mo 590027
|
||||
using namespace std;
|
||||
|
||||
int n, m, mapx[20][20] = {0}, endx, endy;
|
||||
ll all_ans = 0, dp[2][600000] = {0};
|
||||
|
||||
int bits[28] = {0};
|
||||
|
||||
int state[2][600000] = {0}, tots[2] = {0};
|
||||
int pre = 1, cnt = 0;
|
||||
|
||||
struct hash_table {
|
||||
int pre, to;
|
||||
} idx[600000] = {0};
|
||||
int ptr[600000] = {0}, at = 0;
|
||||
|
||||
inline void readit() {
|
||||
cin >> n >> m;
|
||||
char cht = 0;
|
||||
for (int i = 1; i <= n; i++)
|
||||
for (int j = 1; j <= m; j++) {
|
||||
mapx[i][j] = 1;
|
||||
endx = i;
|
||||
endy = j;
|
||||
}
|
||||
}
|
||||
inline void init_bits() {
|
||||
for (int i = 1; i <= 25; i++)
|
||||
bits[i] = (i << 1);
|
||||
}
|
||||
|
||||
inline void hah(int sta, ll val) {
|
||||
int key = sta % mo;
|
||||
for (int prex = ptr[key]; prex; prex = idx[prex].pre)
|
||||
if (state[cnt][idx[prex].to] == sta) {
|
||||
dp[cnt][idx[prex].to] += val;
|
||||
return;
|
||||
}
|
||||
tots[cnt]++;
|
||||
state[cnt][tots[cnt]] = sta;
|
||||
dp[cnt][tots[cnt]] = val;
|
||||
|
||||
idx[++at].pre = ptr[key];
|
||||
idx[at].to = tots[cnt];
|
||||
ptr[key] = at;
|
||||
}
|
||||
|
||||
inline void calc_dp() {
|
||||
tots[cnt] = 1;
|
||||
dp[cnt][1] = 1;
|
||||
state[cnt][1] = 0;
|
||||
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= tots[cnt]; j++)
|
||||
state[cnt][j] <<= 2; //!!!
|
||||
|
||||
for (int j = 1; j <= m; j++) {
|
||||
at = 0;
|
||||
memset(ptr, 0, sizeof ptr); // clear hash_table
|
||||
swap(pre, cnt); // rolling
|
||||
tots[cnt] = 0; // clear state counter
|
||||
|
||||
int nowsta, is_d, is_r;
|
||||
ll nowans;
|
||||
for (int k = 1; k <= tots[pre]; k++) {
|
||||
nowsta = state[pre][k], nowans = dp[pre][k]; // get previous
|
||||
// state&answer
|
||||
is_d = (nowsta >> bits[j]) % 4,
|
||||
is_r = (nowsta >> bits[j - 1]) % 4; // get current plugs
|
||||
|
||||
if (!mapx[i][j]) // case 0
|
||||
{
|
||||
if ((!is_d) && (!is_r))
|
||||
hah(nowsta, nowans);
|
||||
}
|
||||
|
||||
else if ((!is_d) && (!is_r)) // case 1
|
||||
{
|
||||
if (mapx[i + 1][j] && mapx[i][j + 1])
|
||||
hah(nowsta + (1 << bits[j - 1]) + 2 * (1 << bits[j]), nowans);
|
||||
}
|
||||
|
||||
else if ((!is_d) && is_r) // case 2
|
||||
{
|
||||
if (mapx[i + 1][j])
|
||||
hah(nowsta, nowans); // go down
|
||||
if (mapx[i][j + 1])
|
||||
hah(nowsta - is_r * (1 << bits[j - 1]) + is_r * (1 << bits[j]),
|
||||
nowans); // go right
|
||||
}
|
||||
|
||||
else if (is_d && (!is_r)) // case 3
|
||||
{
|
||||
if (mapx[i][j + 1])
|
||||
hah(nowsta, nowans); // go right
|
||||
if (mapx[i + 1][j])
|
||||
hah(nowsta - is_d * (1 << bits[j]) + is_d * (1 << bits[j - 1]),
|
||||
nowans); // go down
|
||||
}
|
||||
|
||||
else if (is_d == 1 && is_r == 1) // case 4
|
||||
{
|
||||
int count = 1;
|
||||
for (int l = j + 1; l <= m; l++) {
|
||||
if ((nowsta >> bits[l]) % 4 == 1)
|
||||
count++;
|
||||
else if ((nowsta >> bits[l]) % 4 == 2)
|
||||
count--;
|
||||
if (!count) {
|
||||
hah(nowsta - (1 << bits[l]) - (1 << bits[j]) - (1 << bits[j - 1]),
|
||||
nowans);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (is_d == 2 && is_r == 2) // case 5
|
||||
{
|
||||
int count = 1;
|
||||
for (int l = j - 2; l >= 0; l--) {
|
||||
if ((nowsta >> bits[l]) % 4 == 1)
|
||||
count--;
|
||||
else if ((nowsta >> bits[l]) % 4 == 2)
|
||||
count++;
|
||||
if (!count) {
|
||||
hah(nowsta - 2 * (1 << bits[j]) - 2 * (1 << bits[j - 1]) +
|
||||
(1 << bits[l]),
|
||||
nowans);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (is_d == 1 && is_r == 2) // case 6
|
||||
hah(nowsta - 2 * (1 << bits[j - 1]) - (1 << bits[j]), nowans);
|
||||
|
||||
else if (is_r == 1 && is_d == 2) // case 7
|
||||
if (i == endx && j == endy)
|
||||
all_ans += (ll)nowans;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
readit();
|
||||
init_bits();
|
||||
calc_dp();
|
||||
// 无方向不用乘 2
|
||||
cout << all_ans * 2 << endl;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user