标签:strong har 状压 space turn -- mat ring highlight
题目链接:https://cometoj.com/contest/38/problem/B?problem_id=1535
数据范围:略。
题解:
因为行数特别小,所以$dp$的时候可以状压起来。
之后就非常傻逼了....
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 1000010
using namespace std;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == ‘-‘)
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
}
int a[N], b[N], f[N][2];
int main() {
int n = rd();
for (int i = 1; i <= n; i ++ ) {
a[i] = rd();
}
for (int i = 1; i <= n; i ++ ) {
b[i] = rd();
}
int l = N, r = 1;
for (int i = 1; i <= n; i ++ ) {
if (a[i] || b[i]) {
l = i;
break;
}
}
for (int i = n; i; i -- ) {
if (a[i] || b[i]) {
r = i;
break;
}
}
for (int i = l; i <= r; i ++ ) {
f[i][0] = f[i - 1][0] + !a[i];
f[i][1] = f[i - 1][1] + !b[i];
f[i][0] = min(f[i][0], f[i][1] + !a[i]);
f[i][1] = min(f[i][1], f[i][0] + !b[i]);
}
cout << min(f[r][0], f[r][1]) << endl ;
return 0;
}
标签:strong har 状压 space turn -- mat ring highlight
原文地址:https://www.cnblogs.com/ShuraK/p/11726377.html