状压DP 所有点RE 求调
查看原帖
状压DP 所有点RE 求调
1050426
lxy_qwq楼主2025/7/1 11:05
#include <iostream>
#include <bitset>
#include <string>
#include <map>
#include <vector>
#include <climits>
using namespace std;
const int MAXN = 100 + 5;
int n, m, q;
int dx[4] = { 0, 0, 1, -1 };
int dy[4] = { 1, -1, 0 , 0 };
#define pr pair
int mp[MAXN][MAXN];
bool vis[MAXN];
int sum[MAXN], sum1[MAXN];
map<pair<int, int>, int> ls;
int xb = 1;
int zy[MAXN][10];
int main() {
    int len = 0;
    cin >> n >> m >> q;
    int _q = q;
    for (int i = 1; i <= q; i++) {
        int x, y, ssum;
        cin >> x >> y >> ssum;
        if (ls[make_pair(x, y)] == 0) {
            ls[make_pair(x, y)] = xb++;
        }
        mp[x][y] += ssum;
        sum[ls[make_pair(x, y)]] += ssum;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) { 
            vector<int> d;
            int sum = 0;
            for (int z = 0; z < 4; z++) {
                int nx = i + dx[z];
                int ny = j + dy[z];
                if (nx < 1 || nx > n || ny < 1 || ny > m || !mp[nx][ny]) {
                    continue;
                }
                sum++;
                d.push_back(ls[make_pair(nx, ny)]);
            }
            if (sum == 0) {
                continue;
            }
            if (sum == 1) {
                if (vis[d[0]] == 0) {
                    vis[d[0]] = 1;
                    zy[++len][1] = d[0];
                }
                else {
                    continue;
                }
            }
            else {
                zy[++len][1] = d[0];
                for (int k = 1; k < d.size(); k++) {
                    zy[len][k + 1] = d[k];
                }
            }
        }
    }
    int result = INT_MAX;
    for (int k = 0; k < (1 << (2 * len)); k++) {
        int ssum = 0;
        for (int i = 1; i <= _q; i++) { 
            sum1[i] = sum[i];
        }
        int __q = _q;
        for (int i = 0; i < len; i++) {
            int now = (k >> (2 * i)) & 0x3; 
            if (now == 0) continue;
            ssum += now;
            for (int j = 1; j < 10; j++) {
                if (zy[i + 1][j] == 0) {
                    continue;
                }
                int mb = zy[i + 1][j];
                if (sum1[mb] <= 0) {
                    continue;
                }
                else {
                    sum1[mb] -= now;
                    if (sum1[mb] <= 0) {
                        __q--;
                    }
                }
            }
        }
        if (__q == 0) {
            result = min(result, ssum);
        }
    }
    cout << result << endl;
    return 0;
}
2025/7/1 11:05
加载中...