Armchairs(动态规划)

链接

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| ij 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(2n5000) — 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(0ai1). 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:

  1. ask a person to move from armchair 1 to armchair 2, it takes 1 minute;
  2. ask a person to move from armchair 7 to armchair 6, it takes 1 minute;
  3. 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:

  1. ask a person to move from armchair 1 to armchair 4, it takes 3 minutes;
  2. ask a person to move from armchair 2 to armchair 6, it takes 4 minutes;
  3. ask a person to move from armchair 4 to armchair 5, it takes 1 minute;
  4. 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) (ji) ,消耗的最短时间。

初始化 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[i1][i1]+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][j1]dp[i1][j1]+abs(ful[i]emp[j])(j0)(i1j0)

设有 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";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_51864047

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值