题目
[题目链接](http://www.51nod.com/Challenge/Problem.html#problemId=1660)
解题思路
使用动态规划解决该问题。
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]表示前i个数都匹配上的最小代价。
d
p
[
i
]
[
1
]
dp[i][1]
dp[i][1]表示前i个数都匹配上除了最后还需要减
−
a
i
-a_i
−ai来产生1。
转移即可。
复杂度O(n)。
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5 + 100;
int n;
int dp[N][2];
char str[N];
void upd(int &a, int b) {
if (a > b) a = b;
}
int main() {
//freopen("0.txt", "r", stdin);
scanf("%s", str + 1);
n = strlen(str + 1);
memset(dp, 0x3f3f3f3f, sizeof(dp));
dp[0][0] = 0; dp[0][1] = 1;
for (int i = 1; i <= n; i++) {
if (str[i] == '0') {
upd(dp[i][0], dp[i - 1][0]);
upd(dp[i][0], dp[i - 1][1] + 1);
upd(dp[i][1], dp[i - 1][0] + 1);
upd(dp[i][1], dp[i - 1][1] + 1);
}
else {
upd(dp[i][0], dp[i - 1][0] + 1);
upd(dp[i][0], dp[i - 1][1] + 1);
upd(dp[i][1], dp[i - 1][0] + 1);
upd(dp[i][1], dp[i - 1][1]);
}
}
printf("%d\n", min(dp[n][0], dp[n][1] + 1));
return 0;
}