题目链接:Armchairs
dp[i][j] 代表,前 i 个 1 和前 j 个 0匹配 消耗的最短时间。初始化为dp[0][i]=0;,详细细节看代码。
//1 1 1 0 0 0
//1 1 0 1 0 0 1
//1 0 0 1 1 0 3
//0 0 0 1 1 1 5
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
int a[maxn],z[maxn],o[maxn];
int dp[maxn][maxn];//dp[i][j] 前i个1和前j个0匹配消耗最短的时间
int main()
{
int n;
cin>>n;
int s=0,g=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==0)
z[++g]=i;//z数组存的是a[i]为0的下标
else
o[++s]=i;//o数组存的是a[i]为1的下标
}
memset(dp,0x3f,sizeof(dp));
for(int i=0;i<=n;i++)
dp[0][i]=0;//初始化
for(int i=1;i<=s;i++)
for(int j=1;j<=g;j++)
dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+abs(z[j]-o[i]));
//dp[i][j-1](不占用第j个0的位置)
//dp[i-1][j-1]+abs(z[j]-o[i])(第i个1占用第j个0的位置)
cout<<dp[s][g]<<endl;
}