D. Armchairs
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
思路
n=5000,很容易想到应该可以用dp做
dp[i][j] 表示 前i个人在前j个椅子中能取到的最小值
代码
ll n, m;
ll s[100005], t[100005], ss, tt;
ll dp[5003][5003];
#define rep(i, a, b) for(int i=a;i<=b;++i)
void work()
{
cin>>n;
rep(i, 1, n){
cin>>m;
if(m) s[++ss]=i;
else t[++tt]=i;
}
memset(dp, 0x3f, sizeof(dp));
rep(i, 0, n) dp[0][i]=0;
rep(i, 1, ss){
dp[i][i]=dp[i-1][i-1]+abs(t[i]-s[i]);
rep(j, i+1, tt){
dp[i][j]=min(dp[i][j-1], dp[i-1][j-1]+abs(s[i]-t[j]));
}
}
cout<<dp[ss][tt]<<endl;
}