状压DP平板涂色WA36pts求调赏1关
查看原帖
状压DP平板涂色WA36pts求调赏1关
670355
Nuclear_Fish_cyq楼主2023/5/19 21:40
#include <bits/stdc++.h>
using namespace std;
long long 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];
		mc = max(color[i], mc);
		for(int j = lx[i]; j < rx[i]; j++){
			for(int k = ly[i]; k < ry[i]; k++){
				b[j][k] = i;
			}
		}
	}
	cout << endl;
	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++){
			f[sta][color[i]] = INT_MAX;
		}
	}
	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);
					}
					else f[sta][color[i]] = min(f[sta][color[i]], f[sta - (1 << (i - 1))][color[i]]);			
				}
			}
		}
	}
//	for(int sta = 1; sta <= ((1 << n) - 1); sta++){//  debug:output array f
//		for(int i = 1; i <= n; i++){
//			if(f[sta][color[i]] == INT_MAX) cout << 0 << " ";
//			else cout << f[sta][color[i]] << " ";
//		}
//		cout << endl;
//	}
	for(int i = 1; i <= mc; i++){
		ans = min(ans, f[(1 << n) - 1][i]); 
	}
	cout << ans << endl;
	return 0;
}
/*
hack data
5
0 0 1 1 1
0 1 1 2 2
0 2 1 3 1
1 0 2 3 1
2 0 3 3 2
*/
2023/5/19 21:40
加载中...