其实看数据量就知道,应该是什么DP了,这里果断是状态压缩dp, n棵树就可以用一个整数表示
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define DIR 4
#define MAXBIT 17
#define DELTA 1000
#define MAXN 1<<MAXBIT
#define INF 0x3f3f3f3f
int dp[MAXN], px[MAXBIT], py[MAXBIT], n, m, rst;
inline int valid(int idx)
{
int cnt( 0 );
for(int i = 0; i < n; i ++) {
if( idx&(1<<i) ) {
cnt += 1;
}
}
return ((n-cnt >= m)? 1 : 0);
}
int change_status(int idx, int _1, int _2)
{
int a, b, c, d;
a = py[_1]-py[_2]; b = px[_1]-px[_2];
for(int i = 0; i < n; i ++) {
if( !(idx&(1<<i)) ) {
continue;
}
c = py[_1]-py[i]; d = px[_1]-px[i];
if( a*d == b*c ) {
idx ^= (1<<i);
}
}
return idx;
}
int dfs(int idx)
{
if( -1 != dp[idx] ) {
return dp[idx];
}
if( !idx || valid(idx) ) {
return dp[idx] = 0;
}
int rst(INF), flag(0);
for(int i = 0; i < n; i ++) {
if( !(idx&(1<<i)) ) {
continue;
}
for(int j = i+1; j < n; j ++) {
if( !(idx&(1<<j)) ) {
continue;
}
flag = 1;
rst = min(rst, 1+dfs(change_status(idx, i, j)));
}
}
if( !flag ) {
rst = 1;
}
return dp[idx] = rst;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int cas(1), cnts;
scanf("%d", &cnts);
for( ; cnts; cnts --) {
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i ++) {
scanf("%d %d", &px[i], &py[i]);
px[i] += DELTA; py[i] += DELTA;
}
memset(dp, -1, sizeof(dp));
if( 1 != cas ) {
printf("\n");
}
printf("Case #%d:\n%d\n", cas ++, dfs((1<<n)-1));
}
return 0;
}
uva_11008 - Antimatter Ray Clearcutting ( 状态压缩DP )
最新推荐文章于 2016-03-05 13:53:13 发布