1 条题解
-
0
C++ :
/*Code by Leo2011*/ #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define EPS 1e-8 #define FOR(i, l, r) for (ll(i) = (l); (i) <= (r); ++(i)) #define log printf #define IOS \ ios::sync_with_stdio(false); \ cin.tie(nullptr); \ cout.tie(nullptr); using namespace std; typedef __int128 i128; typedef long long ll; typedef pair<ll, ll> PII; const int N = 510, M = 310; int m, n, t, x, a[N][N], dp[N][N][M], ans; // dp[i][j][k] = (1, 1) 到(i, j),已经使用了k次机会的最大值 string s; template <typename T> inline T read() { T sum = 0, fl = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') fl = -1; for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0'; return sum * fl; } template <typename T> inline void write(T x) { if (x < 0) { putchar('-'), write<T>(-x); return; } static T sta[35]; ll top = 0; do { sta[top++] = x % 10, x /= 10; } while (x); while (top) putchar(sta[--top] + 48); } int main() { IOS; cin >> t; while (t--) { cin >> n >> m >> x; FOR(i, 1, n) { cin >> s; for (int j = 0;j < m;++j) { if (s[j] == '?') a[i][j + 1] = -INF; else a[i][j + 1] = s[j] - '0'; } } FOR(i, 1, n) FOR(j, 1, m) FOR(k, 0, x) { // 要用到 k - 1, 必须正序遍历。 switch(a[i][j]) { case -INF: if (k > 0) dp[i][j][k] = max(dp[i][j - 1][k - 1], dp[i - 1][j][k - 1]) + 1; else dp[i][j][k] = max(dp[i][j - 1][k], dp[i - 1][j][k]); break; case 1: dp[i][j][k] = max(dp[i][j - 1][k], dp[i - 1][j][k]) + 1; break; case 0: dp[i][j][k] = max(dp[i][j - 1][k], dp[i - 1][j][k]); break; } } FOR(i, 0, x) ans = max(ans, dp[n][m][i]); // 不超过就是不一定,要遍历一遍 cout << ans << endl; memset(dp, 0, sizeof(dp)); memset(a, 0, sizeof(a)); ans = -INF; // 多组数据要清空 } return 0; }
- 1
信息
- ID
- 5625
- 时间
- 5000ms
- 内存
- 1024MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者