链接:http://poj.org/problem?id=3276
如果第i头牛面朝后,则,这个区间必须进行反转
f[i] 记录区间 [i,i+K-1] 内是否进行反转。
在考虑第i个的方向时,判断f[i-1]~f[i-K+1]的和是奇数还是偶数就行了..
#include <iostream> #include<cstring> #define MAX_N 5000 using namespace std; int N; int dir[MAX_N]; // 牛的方向 (0:F,1:B) int f[MAX_N]; int calc(int K) { memset(f,0,sizeof(f)); int res=0; int sum=0; for(int i=0;i+K<=N;i++) { if((dir[i]+sum)%2 != 0) { res++; f[i]=1; } sum+=f[i]; if(i-K+1>=0) sum-=f[i-K+1]; } for(int i=N-K+1;i<N;i++) { if((dir[i]+sum)%2!=0) return -1; if(i-K+1>=0) sum-=f[i-K+1]; } return res; } void solve() { int K=1,M=N; for(int k=1;k<=N;k++) { int m=calc(k); if(m>=0 && M>m) { M=m; K=k; } } cout<<K<<" "<<M<<endl; } int main() { cin>>N; for(int i=0;i<N;i++) { char t; cin>>t; dir[i]=t=='F'?0:1; } solve(); return 0; }