【DP】 HDOJ 3545 Board Coloring

非常巧妙的DP。。。。

#include <iostream>
#include <queue> 
#include <stack> 
#include <map> 
#include <set> 
#include <bitset> 
#include <cstdio> 
#include <algorithm> 
#include <cstring> 
#include <climits>
#include <cstdlib>
#include <cmath>
#include <time.h>
#define maxn 100005
#define maxm 4000005
#define eps 1e-10
#define mod 100000
#define INF 1e9
#define lowbit(x) (x&(-x))
#define mp make_pair
#define ls o<<1
#define rs o<<1 | 1
#define lson o<<1, L, mid 
#define rson o<<1 | 1, mid+1, R 
typedef long long LL;
typedef unsigned long long ULL;
//typedef int LL;
using namespace std;

int vis[20][20][20][20];
int dp[20][20][20][20];
int p[10];
int n, m;

void init(void)
{
	memset(dp, 0, sizeof dp);
	memset(vis, 0, sizeof vis);
}

void read(void)
{
	int x, y, xx, yy;
	scanf("%d%d", &n, &m);
	for(int i = 0; i < m; i++) {
		scanf("%d%d%d%d", &x, &y, &xx, &yy);
		for(p[1] = 0; p[1] <= n; p[1]++)
			for(p[2] = 0; p[2] <= n; p[2]++)
				for(p[3] = 0; p[3] <= n; p[3]++)
					for(p[4] = 0; p[4] <= n; p[4]++)
						if((p[x] < y) ^ (p[xx] < yy))
							vis[p[1]][p[2]][p[3]][p[4]] = 1;
	}
}

void work(void)
{
	dp[0][0][0][0] = 1;
	for(int i = 0; i <= 255; i++) {
		for(int delta = 1; delta <= 4; delta++)
			for(p[1] = 0; p[1] <= n; p[1]++)
				for(p[2] = 0; p[2] <= n; p[2]++)
					for(p[3] = 0; p[3] <= n; p[3]++)
						for(p[4] = 0; p[4] <= n; p[4]++)
							if(p[delta]) {
								int &t = dp[p[1]][p[2]][p[3]][p[4]];
								p[delta]--;
								t += dp[p[1]][p[2]][p[3]][p[4]];
								if(t >= mod) t -= mod;
								p[delta]++;
							}
		for(p[1] = 0; p[1] <= n; p[1]++)
			for(p[2] = 0; p[2] <= n; p[2]++)
				for(p[3] = 0; p[3] <= n; p[3]++)
					for(p[4] = 0; p[4] <= n; p[4]++)
						if(vis[p[1]][p[2]][p[3]][p[4]])
							dp[p[1]][p[2]][p[3]][p[4]] = 0;
	}
	printf("%05d\n", dp[n][n][n][n]);
}

int main(void)
{
	int _, __;
	while(scanf("%d", &_)!=EOF) {
		__ = 0;
		while(_--) {
			init();
			read();
			printf("Case %d: ", ++__);
			work();
		}
	}

	return 0;
}


你可能感兴趣的:(dp,HDU)