There are n n n armchairs, numbered from 1 1 1 to n n n from left to right. Some armchairs are occupied by people (at most one person per armchair), others are not. The number of occupied armchairs is not greater than n 2 \frac n2 2n.
For some reason, you would like to tell people to move from their armchairs to some other ones. If the i-th armchair is occupied by someone and the j-th armchair is not, you can tell the person sitting in the i-th armchair to move to the j-th armchair. The time it takes a person to move from the i-th armchair to the j-th one is ∣ i − j ∣ |i−j| ∣i−j∣ minutes. You may perform this operation any number of times, but these operations must be done sequentially, i. e. you cannot tell a person to move until the person you asked to move in the last operation has finished moving to their destination armchair.
You want to achieve the following situation: every seat that was initially occupied must be free. What is the minimum time you need to do it?
Input
The first line contains one integer n ( 2 ≤ n ≤ 5000 ) n (2≤n≤5000) n(2≤n≤5000) — the number of armchairs.
The second line contains n n n integers a 1 , a 2 , … , a n ( 0 ≤ a i ≤ 1 ) a_1,a_2,…,a_n (0≤a_i≤1) a1,a2,…,an(0≤ai≤1). a i = 1 a_i=1 ai=1 means that the i-th armchair is initially occupied, a i = 0 a_i=0 ai=0 means that it is initially free. The number of occupied armchairs is at most n 2 \frac n2 2n.
Output
Print one integer — the minimum number of minutes you have to spend to achieve the following situation: every seat that was initially occupied must be free.
Examples
input
7
1 0 0 1 0 0 1
output
3
input
6
1 1 1 0 0 0
output
9
input
5
0 0 0 0 0
output
0
Note
In the first test, you can perform the following sequence:
- ask a person to move from armchair 1 to armchair 2, it takes 1 minute;
- ask a person to move from armchair 7 to armchair 6, it takes 1 minute;
- ask a person to move from armchair 4 to armchair 5, it takes 1 minute.
In the second test, you can perform the following sequence:
- ask a person to move from armchair 1 to armchair 4, it takes 3 minutes;
- ask a person to move from armchair 2 to armchair 6, it takes 4 minutes;
- ask a person to move from armchair 4 to armchair 5, it takes 1 minute;
- ask a person to move from armchair 3 to armchair 4, it takes 1 minute.
In the third test, no seat is occupied so your goal is achieved instantly.
思路
求出 0 0 0 与 1 1 1 出现的位置,存在 e m p [ N ] emp[N] emp[N] 与 f u l [ N ] ful[N] ful[N] 数组中。
d p [ i ] [ j ] dp[i][j] dp[i][j] 代表,前 i i i 个 1 1 1 和前 j j j 个 0 0 0 匹配 ( j ≥ i ) (j \ge i) (j≥i) ,消耗的最短时间。
初始化 d p [ i ] [ i ] = d p [ i − 1 ] [ i − 1 ] + a b s ( f u l [ i ] − e m p [ i ] ) dp[i][i]=dp[i-1][i-1]+abs(ful[i]-emp[i]) dp[i][i]=dp[i−1][i−1]+abs(ful[i]−emp[i]).
之后的状态转移方程为:
d p [ i ] [ j ] = m i n { d p [ i ] [ j − 1 ] ( 不 占 用 第 j 个 0 的 位 置 ) d p [ i − 1 ] [ j − 1 ] + a b s ( f u l [ i ] − e m p [ j ] ) ( 第 i 个 1 占 用 第 j 个 0 的 位 置 ) dp[i][j]=min \left\{ \begin{array}{lr} dp[i][j-1]&(不占用第j个0的位置)\\ dp[i-1][j-1]+abs(ful[i]-emp[j])&(第i个1占用第j个0的位置)\\ \end{array} \right. dp[i][j]=min{dp[i][j−1]dp[i−1][j−1]+abs(ful[i]−emp[j])(不占用第j个0的位置)(第i个1占用第j个0的位置)
设有 t 1 t_1 t1 个 1 1 1, t 2 t_2 t2 个 0 0 0,答案为 d p [ t 1 ] [ t 2 ] dp[t_1][t_2] dp[t1][t2].
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
int n,a[N],emp[N],ful[N],t1,t2,dp[N][N];
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) if(a[i]) ful[++t1]=i;
for(int i=1;i<=n;i++) if(!a[i]) emp[++t2]=i;
for(int i=1;i<=n;i++) dp[i][i]=dp[i-1][i-1]+abs(emp[i]-ful[i]);
for(int i=1;i<=t1;i++)
for(int j=i+1;j<=t2;j++)
dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+abs(emp[j]-ful[i]));
cout<<dp[t1][t2]<<"\n";
}