暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns

时间:2023-03-09 16:17:42
暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns

题目传送门

 /*
题意:删除若干行,使得n行字符串成递增排序
暴力+构造:从前往后枚举列,当之前的顺序已经正确时,之后就不用考虑了,这样删列最小
*/
/************************************************
Author :Running_Time
Created Time :2015-8-3 10:49:53
File Name :C.cpp
*************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e2 + ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
char s[MAXN][MAXN];
int n, m;
bool ok[MAXN][MAXN]; int main(void) { //Codeforces Round #283 (Div. 2) C. Removing Columns
while (scanf ("%d%d", &n, &m) == ) {
for (int i=; i<=n; ++i) {
scanf ("%s", s[i] + );
}
int ans = ; memset (ok, false, sizeof (ok));
bool flag = true;
for (int j=; j<=m; ++j) {
flag = true;
for (int i=; i<=n; ++i) {
if (ok[i][i-]) continue;
if (s[i][j] < s[i-][j]) {
ans++; flag = false; break;
}
}
if (flag) {
for (int k=; k<=n; ++k) {
if (s[k][j] > s[k-][j]) ok[k][k-] = true;
}
}
}
printf ("%d\n", ans);
} return ;
}