uva_11008 - Antimatter Ray Clearcutting ( 状态压缩DP )

来源:互联网 发布:单片机电压表 编辑:程序博客网 时间:2024/06/15 15:19
其实看数据量就知道,应该是什么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     0x3f3f3f3fint 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;}

原创粉丝点击