problem:
http://codeforces.com/problemset/problem/496/C
给n个长度为m的字符串。删掉第j列的意思是把每一行的第j个字符都删掉。
问,最少删除几列,使得这n个字符串是非减的。即第i个字符串的字典序不大于第i+1个字符串。
1<=n, m<=100
think:
枚举每个当前列能不能删。已经当前列和上面的串的关系,大于还是等于。
code:
const int N = 1010;
int n, m;
char str[N][N];
bool f[2][N];
int main(){
while(scanf("%d%d", &n, &m) != EOF){
for(int i = 0; i < n; ++i) scanf("%s", str[i]);
for(int i = 0; i < n; ++i) f[1][i] = 0;
int ans = 0;
for(int j = 0; j < m; ++j){
int jj = (j & 1);
bool del = 0;
for(int i = 1; i < n; ++i){
if(f[jj^1][i] == 0 && str[i][j] < str[i-1][j]){
del = 1;
break;
} else if(f[jj^1][i] == 0 && str[i][j] == str[i-1][j]){
f[jj][i] = 0;
} else {
f[jj][i] = 1;
}
}
//cout<<endl;
if(del){
++ans;
for(int i = 1; i < n; ++i){
f[jj][i] = f[jj^1][i];
}
}
}
printf("%d\n", ans);
}
return 0;
}