平板涂色状压DP样例未过0ptsWA求调
查看原帖
平板涂色状压DP样例未过0ptsWA求调
670355
Nuclear_Fish_cyq楼主2023/5/18 20:37
#include <bits/stdc++.h>
using namespace std;
int n, f[(1 << 16) + 1][20], color[20], b[100][100], mc, num[20], t[20][20], lx[20], ly[20], rx[20], ry[20], ans = INT_MAX;
bool check(int sta, int x){
	for(int i = 1; i <= num[x]; i++){
		if(((i << (t[x][i] - 1)) & sta) != (i << (t[x][i] - 1))){
			return false;
		} 
	}
	return true;
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> lx[i] >> ly[i] >> rx[i] >> ry[i] >> color[i];
		if(color[i] > mc){
			mc = color[i];
		}
		for(int j = lx[i]; j < rx[i]; j++){
			for(int k = ly[i]; k < ry[i]; k++){
				b[j][k] = i;
			}
		}
	}
	for(int i = 1; i <= n; i++){
		int k = lx[i] - 1;
		if(k < 0){
			continue;
		}
		for(int j = ly[i]; j < ry[i];){
			if(b[k][j]){
				int l = j;
				while(b[k][l] == b[k][j]){
					l++;
				}
				num[i]++;
				t[i][num[i]] = b[k][j];
				j = l;
			}
		}
	}
	for(int i = 1; i <= mc; i++){
		f[0][i] = 1;
	}
	for(int sta = 1; sta <= ((1 << n) - 1); sta++){
		for(int i = 1; i <= n; i++){
			if(((1 << (i - 1)) & sta) == (1 << (i - 1)) && check(sta, i)){
				for(int j = 1; j <= mc; j++){
					if(j != color[i]){
						f[sta][color[i]] = min(f[sta][color[i]], f[sta - (1 << (i - 1))][j] + 1);
					}
					f[sta][color[i]] = min(f[sta][color[i]], f[sta - (1 << (i - 1))][color[i]]);			
				}
			}
		}
	}
	for(int i = 1; i <= mc; i++)
        ans = min(ans, f[(1 << n) - 1][i]);
    cout << ans << endl;
    return 0;
}
2023/5/18 20:37
加载中...