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;}