1 条题解

  • 0
    @ 2025-11-3 0:09:35

    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
    上传者