ZOJ 2297 Survival (状态dp)
2014-04-15 21:50
316 查看
OJ题目:click here ~~
题目分析:和n个人打架,第n个是boss , boss一定是最后一个打,前面n-1个可任意排序。跟每个人打架需要消耗一定的HP,打赢之后也能恢复一定的HP,由输入提供。判断能不能打赢这n个人。
打boss之前, 共有1 <<(n - 1) 中状态,枚举这么多状态,判断dp[1 << (n - 1)]够不够打boss,即前n-1个人打完之后,HP的最大值 是否大于等于boss 的HP值。
AC_CODE
题目分析:和n个人打架,第n个是boss , boss一定是最后一个打,前面n-1个可任意排序。跟每个人打架需要消耗一定的HP,打赢之后也能恢复一定的HP,由输入提供。判断能不能打赢这n个人。
打boss之前, 共有1 <<(n - 1) 中状态,枚举这么多状态,判断dp[1 << (n - 1)]够不够打boss,即前n-1个人打完之后,HP的最大值 是否大于等于boss 的HP值。
AC_CODE
struct Node { int cost; int rec; Node(){} }node[22]; int n; int dp[1<<20]; int main(){ while(cin >> n) { n--; int i , j , boss; for(i = 0;i < n;i++) scanf("%d%d",&node[i].cost,&node[i].rec); scanf("%d",&boss); memset(dp , -1 , sizeof(dp)); dp[0] = 100; for(i = 0;i < (1<<n);i++) { if(dp[i] < 0) continue; for(j = 0;j < n;j++) { if(i&(1<<j)) continue; if(dp[i] < node[j].cost) continue; int t = dp[i] - node[j].cost + node[j].rec; if(t >= 100) dp[i|(1<<j)] = 100; else dp[i|(1<<j)] = max(dp[i|(1<<j)] , t); } } if(dp[(1<<n) - 1] < boss) printf("try again\n"); else printf("clear!!!\n"); } return 0 ; }
相关文章推荐
- ZOJ 2297 Survival 状态压缩DP
- zoj 2297【DP+位运算状态压缩】
- ZOJ 2297 Survival 【状态压缩】
- zoj 2297 状态压缩DP
- ZOJ 4257 Most Powerful (状态压缩DP)
- ZOJ3471——Most Powerful(状态压缩DP)
- zoj 3502 Contest (状态压缩dp)
- zoj 3190 / hdu 3247 Resource Archiver AC自动机+BFS+状态dp
- ZOJ 3502 Contest 状态压缩dp
- ZOJ 2673 Hexagon and Rhombic Dominoes (状态压缩+dp)
- ZOJ 2522 —— Fellowship Activity(状态压缩DP)
- ZOJ 3502 Contest (状态压缩+DP , py大法好)
- ZOJ 3812 We Need Medicine(dp、背包、状态压缩、路径记录)
- zoj 3471状态压缩DP
- poj 2411 && zoj 1100 Mondriaan's Dream ———状态压缩dp
- ZOJ - 3777 —— Problem Arrangement —— 状态压缩DP
- ZOJ 3471 Most Powerful(DP + 状态压缩)
- zoj 3471 Most Powerful //状态压缩DP
- ZOJ 3471 【状态压缩DP】
- zoj 3471(状态压缩DP,类似于点集配对)