uva 11008(状态压缩+记忆化搜索)
2013-10-17 12:20
351 查看
这题属于状态压缩DP中比较基础的一题,经过仔细分析后我们发现此题虽然坐标范围较大,但是点比较少最多才16个很容易想到用状态压缩。dp[x]表示当前树的状态最少要转移的次数(砍的次数)。具体状态转移由于他状态转移的顺序比较乱所以用的是记忆化搜索。起始状态是(1<<n)-1,边界是已有树的数目小于n-m(kk)返回0,只多出一棵树是返回1。
代码如下:
代码如下:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int n, kk, ans, dp[1000000]; //状态压缩数组一共2^16个状态 typedef struct Point{ int x, y; }P; P p[20]; //判断三点是否共线 bool isline(int i,int j,int k) { int a=p[i].x-p[j].x,b=p[i].y-p[j].y; int c=p[j].x-p[k].x,d=p[j].y-p[k].y; return a*d==b*c; } int Judge(int x) { int ret = 0; while(x){ ret+=(x&1); x>>=1; } return ret; } void init() { scanf("%d%d", &n, &kk); for(int i=0; i<n; i++){ scanf("%d%d", &p[i].x, &p[i].y); } ans = 20; memset(dp, -1, sizeof dp); } int solve(int x) { if(dp[x]!=-1) return dp[x]; if(Judge(x)<=n-kk) return 0; if(Judge(x)==n-kk+1) return dp[x] = 1; int ret = 20; for(int i=0; i<n; i++) if((1<<i)&x){ for(int j=i+1; j<n; j++) { if((1<<j)&x){ //两棵树都在枚举直线 int tx = x; for(int k=0; k<n; k++){ if((1<<k)&x && isline(i, j, k)){ tx -= (1<<k); } } ret = min(ret, solve(tx)+1); } } } return dp[x] = ret; } int main() { //freopen("in.txt","r", stdin); //freopen("out.txt","w", stdout); int T, cnt; scanf("%d", &T); for(cnt=1; cnt<=T; cnt++) { init(); ans = solve((1<<n)-1); printf("Case #%d:\n", cnt); printf("%d\n", ans); if(cnt!=T) printf("\n"); } return 0; }
相关文章推荐
- UVA 11008--Antimatter Ray Clearcutting+状态压缩记忆化搜索
- UVA 11008 Antimatter Ray Clearcutting(状态压缩+记忆化搜索)
- uva 11008 Antimatter Ray Clearcutting(DFS + 记忆化搜索 + 状态压缩)
- uva 11008 Antimatter Ray Clearcutting 状态压缩+记忆化搜索
- uva11008 - Antimatter Ray Clearcutting 状态压缩记忆化搜索
- UVALive 6432 —— Influence(记忆化搜索 + 状态压缩)
- UVA 1252 Twenty Questions 状态压缩dp 记忆化搜索
- uva 11008(dp + 状态压缩)
- uva 10651 Pebble Solitaire(dp,状态压缩,记忆化搜索)
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- Pebble Solitaire+uva+状态压缩+记忆化搜索
- uva11008(dp + 状态压缩)
- UVa 11008 Antimatter Ray Clearcutting / 状态压缩DP
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- UVA10817-----Headmaster's Headache-----状态压缩的背包(记忆化搜索实现)
- UVA - 11008 Antimatter Ray Clearcutting 状态压缩
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- UVa 11008 - Antimatter Ray Clearcutting(状态压缩dp)