问题描述
PIPIOJ1478:http://pipioj.online/problem.php?id=1478
PIPI有一个长度为n的01串,现在它想通过翻转操作(每次翻转操作可使某一个位置从0->1或者1->0),使得这个不规则的01串变得规则起来——将01串变成可以为空的两部分组成,前一部分全为0,后一部分全为1。
另外,前后两个部分可以为空(但不能同时为空) ,换句话说,就是全为0或者全为1都是合法的。
现在它想知道,最少操作多少次,能够使得01串变得规则。
输入
第一行为一个正整数n,n<=1e5.
第二行为一个长度为n的01串.
输出最少的操作次数,使得01串变得规则。
样例输入
6
010110
样例输出
2
分析
这道题挺简单的,
- 首先用前缀和求出第i个数之前1的个数dp[i];
- 依次计算对于每一个i,以i为中间节点时所需要的最大代价,即左边为1的个数和右边为0的个数之和
- 找到最小的那个输出
代码
#include<bits/stdc++.h>
using namespace std;
char s[100005];
int dp[100005]={0};
int main(){
int n;
scanf("%d",&n);
scanf("%s",s);
dp[0]=s[0]=='1'?1:0;
for(int i=1;i<n;i++){
if(s[i]=='1') dp[i]=dp[i-1]+1;
else dp[i]=dp[i-1];
}
int ans=min(dp[n-1],n-dp[n-1]);
for(int i=1;i<n-2;i++) ans=min(ans,n-1-i+dp[i-1]-dp[n-1]+dp[i]);
printf("%d\n",ans);
}
总结
无