题解:AT_abc442_f [ABC442F] Diagonal Separation 2
我们假设第
所以问题转换为,求出一个序列满足
其中
时间复杂度
代码里使用滚动数组压缩掉了第一维,并且直接复用
代码:
namespace Star_F{
const int N = 5005;
int n, dp[N];
string S;
void Main(){
cin >> n;
for (int i = 0; i < n; i++){
cin >> S;
if (i > 0)
for (int j = n - 1; j >= 0; j--)
dp[j] = min(dp[j], dp[j + 1]);
int cnt = 0;
for (char c : S) cnt += (c == '.');
int c1 = 0, c2 = 0;
for (int j = 0; j <= n; j++){
dp[j] += c1 + cnt - c2;
if (j < n){
if (S[j] == '#') c1++;
else c2++;
}
}
}
for (int i = 1; i <= n; i++) dp[0] = min(dp[0], dp[i]);
cout << dp[0] << endl;
}
}