AOJ 0534: Chain
実装。色の変え方が最大で2パターンあるので、両方とも試す。
#include<cstdio> #include<algorithm> using namespace std; int n,chain[10000]; int fig(int b){ int a = b-1,c = b+1,color,res = 0; if(a>=0){//b == 0のバターンを弾く int s = 1; color = chain[a]; while(a>=0 && color==chain[a])a--,s++; while(c<n && color==chain[c])c++,s++; if(s>=4)while(a>=0 && c<n){ int t = 0; color = chain[a]; while(a>=0 && color==chain[a])a--,t++; while(c<n && color==chain[c])c++,t++; if(t>=4) s+=t; else break; } else s = 0; res = s; a = b-1;c = b+1; } if(c<n&&(a<0||chain[a]!=chain[c])){//b == n-1のパターンとchain[a] == chain[c]のパターンを弾く int s = 1; color = chain[c]; while(a>=0 && color==chain[a])a--,s++; while(c<n && color==chain[c])c++,s++; if(s>=4)while(a>=0 && c<n){ int t = 0; color = chain[a]; while(a>=0 && color==chain[a])a--,t++; while(c<n && color==chain[c])c++,t++; if(t>=4) s+=t; else break; } else s = 0; res = max(res,s); } return res; } int main(){ while(scanf("%d",&n),n){ int del = 0; for(int i = 0; i < n; i++){ scanf("%d",chain+i); } for(int i = 0; i < n; i++) del = max(del,fig(i)); printf("%d\n",n-del); } return 0; }