反转一串字符串,使其一致,问翻转的最小长度和最小次数;枚举法,在求解时优化。
枚举k,用一个f[i]数组表示区间【i,i+k-1】是否进行反转,一个区间进行两次以上反转是多余的;最后看是否还有不一致的情况
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<stack>
#include<memory.h>
#include<ctype.h>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 5000 + 5;
int n;
int dir[maxn];
int f[maxn];
int cal(int k) {
memset(f, 0, sizeof(f));
int ans = 0;
int sum = 0;
for (int i = 0; i + k <= n; i++) {
if ((dir[i] + sum) % 2 != 0) {
ans++;
f[i] = 1;
}
sum += f[i];
if (i - k + 1 >= 0) {
sum -= f[i - k + 1];
}
}
for (int i = n - k + 1; i < n;