题解:设dp(i,j)表示前i个人坐上前j个椅子的最小代价,根据第j个椅子是否被i坐进行集合划分可分为两种状态,若i坐上了j即dp[i][j]=dp[i-1][j-1]+dist(i,j),否则dp[i][j]=dp[i][j-1]。

AC代码:

#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=5010,INF=1e16;
int n;
int dp[N][N];
int a[N],b[N];

main(){
cin>>n;

int na=0,nb=0;
for(int i=0;i<n;i++){
int x;
cin>>x;
if(x==1)a[++na]=i;
else b[++nb]=i;
}

memset(dp,0x3f,sizeof dp);

for(int i=0;i<=nb;i++)dp[0][i]=0;

for(int i=1;i<=na;i++)
for(int j=i;j<=nb;j++)
dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+abs(a[i]-b[j]));

cout<<dp[na][nb]<<endl;
}