60pts 求调
查看原帖
60pts 求调
556914
Thomas0218楼主2024/9/4 22:52
#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 都过了。 谢谢!

2024/9/4 22:52
加载中...