博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
URAL 1152. False Mirrors (记忆化搜索 状压DP)
阅读量:4562 次
发布时间:2019-06-08

本文共 1506 字,大约阅读时间需要 5 分钟。

题意 : 每一颗子弹破坏了三个邻近的阳台。(第N个阳台是与第1个相邻)射击后后的生存的怪物都对主角造成伤害- 如此,直到所有的怪物被消灭,求怎样射击才能受到最少伤害。

思路 : 状压,数据不是很大,可以爆一爆,或者DFS下去就行,枚举每一种状态。

1 //1152 2 #include 
3 #include
4 #include
5 #define oo 1 << 28 6 using namespace std ; 7 8 int a[110],dp[1 << 21] ; 9 bool vis[1 << 21] ;10 int n ;11 12 int DFS(int sta,int sum)13 {14 if(vis[sta]) return dp[sta] ;15 vis[sta] = true ;16 if(sta == 0) return dp[sta] = 0 ;17 int ans = oo ;18 for(int i = 0 ; i < n ; i++)19 {20 int newsta = sta ,newsum = sum ;21 for(int j = i-1 ; j <= i+1 ; j++)22 {23 int k = j ;24 if(j == -1) k = n-1 ;25 else if(j == n) k = 0 ;26 if(newsta & (1 << k))27 {28 newsta -= (1 << k) ;29 newsum -= a[k] ;30 }31 }32 if(newsta != sta)33 ans = min(ans,DFS(newsta,newsum)+newsum) ;34 }35 return dp[sta] = ans ;36 }37 int main()38 {39 while(~scanf("%d",&n))40 {41 int sum = 0 ;42 memset(a,0,sizeof(a)) ;43 memset(dp,63,sizeof(dp)) ;44 memset(vis,false,sizeof(vis)) ;45 for(int i = 0 ; i < n ; i++)46 {47 scanf("%d",&a[i]) ;48 sum += a[i] ;49 }50 dp[(1 << n)-1] = 0 ;51 printf("%d\n",DFS((1 << n)-1,sum)) ;52 }53 return 0 ;54 }
View Code

 

转载于:https://www.cnblogs.com/luyingfeng/p/3948138.html

你可能感兴趣的文章
SVN入门教程
查看>>
angular2
查看>>
24点游戏 程序(二)
查看>>
linux ----> centos 网络、tomcat、vi、等等的配置和使用
查看>>
Hive导入数据
查看>>
【剑指offer】数值的整数次方
查看>>
CentOS 7 系统服务详解
查看>>
最小生成树------Kruskal算法
查看>>
手动构建镜像
查看>>
实际描述和固定描述的取值
查看>>
MyEclipse优化设置(最详细版本)
查看>>
Company & Corporation
查看>>
如何在github pages中创建自己的Jekyll博客并绑定域名(2018-11-29)
查看>>
java--final 类在程序中的影响
查看>>
mysql主从复制,及扩展
查看>>
[Leetcode] Linked list cycle ii 判断链表是否有环
查看>>
Java设计模式之《代理模式》及应用场景
查看>>
iOS中的请求下载和直接下载的区别
查看>>
【Linux基础】vim使用技巧(未整理)
查看>>
CODEFORCES掉RATING记 #5
查看>>