#include <bits/stdc++.h>
using namespace std;
const int N = 205;
int n, m, k, a[N][N], c[N][N], s[N][N], t[N][N], f[N][N], g[N][N], last[N][N];;
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
char op; cin >> a[i][j] >> op;
if(op == 'Y') c[i][j] = 0;
else c[i][j] = 1;
}
}
for(int i = 1; i <= m; i++) {
for(int j = n; j >= 1; j--) {
s[i][j] = s[i][j+1] + a[j][i];
t[i][j] = t[i][j+1] + c[j][i];
last[i][j] = (c[j][i] == 0) ? last[i][j+1] + 1 : 0;
}
}
for(int i = 1; i <= m; i++) {
for(int j = 0; j <= k; j++) f[i][j] = f[i-1][j];
for(int j = 1; j <= k; j++) {
for(int l = n; l >= 1; l--) {
if(j < t[i][l]) continue ;
f[i][j] = max(f[i][j], f[i-1][j-t[i][l]] + s[i][l]);
}
}
}
for(int i = m; i >= 1; i--) {
for(int j = 0; j <= k; j++) g[i][j] = g[i+1][j];
for(int j = 1; j <= k; j++) {
for(int l = n; l >= 1; l--) {
if(j < t[i][l]) continue ;
g[i][j] = max(g[i][j], g[i+1][j-t[i][l]] + s[i][l]);
}
}
}
int ans = 0;
for(int i = 1; i <= m; i++) {
for(int j = n; j >= 1; j--) {
int mx = k - (t[i][j] + last[i][j]);
for(int l = 0; l <= mx; l++)
ans = max(ans, f[i-1][l] + g[i+1][mx-l] + s[i][j]);
}
}
printf("%d\n", ans);
return 0;
}
分组背包,枚举选择的最后一列,sub0最后几个点WA了,讨论区的 hack 都过了。 谢谢!