AtCoder Beginner Contest 467 C - Adjacent Sums (easy) 题解
前言
- cccccD读假了没搞完
- 初中白上了
solve
-
e,msjing \(DP\) 写假了,吃了 \(7\) 发罚时,hyw
-
\(DP\) 设计为第 \(i\) 个点翻转还是不翻转,给转移方程
\(f_{i+1,0} = \begin{cases} f_{i,0} & ((a_i + a_{i+1}) \bmod 2 = 0)\\ f_{i,1} & ((a_i \oplus 1 + a_{i+1}) \bmod 2 = 0) \end{cases}\)
\(f_{i+1,1} = \begin{cases} f_{i,0}+1 & ((a_i + a_{i+1} \oplus 1) \bmod 2 = 0)\\ f_{i,1} + 1 & ((a_i \oplus 1 + a_{i+1} \oplus 1) \bmod 2 = 0) \end{cases}\) -
\(\LaTeX\) 太脱模难敲了,估计会出锅,e,转移以代码为准
-
msjing:555我下次一定认真敲
code
#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=2e5+10,inf=2e5+1;
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || ch>'9')
{
if (ch == '-') f=-1;
ch=getchar();
}
while (ch>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
int n,m;
int a[maxn],b[maxn];
int f[maxn][2];
int main()
{
n=read(),m=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<n;i++) b[i]=read();
memset(f,0x3f,sizeof(f));
f[0][0]=f[0][1]=0;
for (int i=0;i<n;i++)
{
if ((a[i]+a[i+1])%2 == b[i]) f[i+1][0]=min(f[i+1][0],f[i][0]);
if (((a[i]^1)+a[i+1])%2 == b[i]) f[i+1][0]=min(f[i+1][0],f[i][1]);
if ((a[i]+(a[i+1]^1))%2 == b[i]) f[i+1][1]=min(f[i+1][1],f[i][0]+1);
if (((a[i]^1)+(a[i+1]^1))%2 == b[i]) f[i+1][1]=min(f[i+1][1],f[i][1]+1);
// cout << f[i][0] << " " << f[i][1] << endl;
}
printf("%d\n",min(f[n][0],f[n][1]));
return 0;
}
后话
- cnm \(DP\) 常常爆


浙公网安备 33010602011771号