JZYZOJ1384 种花小游戏 状压dp

http://172.20.6.3/Problem_Show.asp?id=1384

最开始以为是dfs然后超时了,然后调了半天调成dp,还不如再写一遍。。。

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxn=1<<25;
 8 int n,x,y;
 9 int a[20][2]={};
10 double f[(1<<16)+10][20]={};
11 int vis[20]={};
12 double ans=(1<<30);
13 int main(){
14     scanf("%d",&n);int x,y;
15     for(int i=0;i<n;i++){
16         scanf("%d%d",&a[i][0],&a[i][1]);
17     }scanf("%d%d",&x,&y);
18     int ma=1<<n;
19     for(int i=1;i<ma;i++){
20         for(int j=0;j<n;j++){
21             f[i][j]=1.0*maxn;
22         }
23     }
24     int x1,x2;double y1,y2,wtf;
25     for(int i=0;i<n;i++){
26         x1=1<<i;
27         y1=(double)abs(a[i][0]-x);y2=(double)abs(a[i][1]-y);
28         wtf=sqrt((double)y1*y1+y2*y2);
29         f[x1][i]=wtf;
30     }int wt=1;
31     for(int i=1;i<ma;i++){
32         if(i==wt){wt*=2;continue;}
33         for(int j=0;j<n;j++){
34             x1=1<<j;if((x1|i)!=i)continue;
35             for(int w=0;w<n;w++){
36                 x2=1<<w;
37                 if((x2|i)!=i||w==j)continue;
38                 y1=(double)abs(a[j][0]-a[w][0]);y2=(double)abs(a[j][1]-a[w][1]);
39                 wtf=sqrt((double)y1*y1+y2*y2);
40                 if(f[i-x1][w]+wtf-f[i][j]<0){
41                     f[i][j]=f[i-x1][w]+wtf;
42                 }
43             }
44         }
45     }double ans=maxn;
46     for(int i=0;i<n;i++){
47         if(f[ma-1][i]<ans)ans=f[ma-1][i];
48     }
49     printf("%.2f",ans);
50     return 0;
51 }

时间: 2024-08-12 14:15:21

JZYZOJ1384 种花小游戏 状压dp的相关文章

cf16E Fish(状压DP)

题意: N只FISH.每个回合会有一只FISH吃掉另一个FISH.直到池塘里只剩一只FISH. 给出aij:第i只FISH吃掉第J只FISH的概率. 问每一只FISH是最后存活者的概率. Input The first line contains integer n (1 ≤ n ≤ 18) — the amount of fish in the lake. Then there follow n lines with n real numbers each — matrix a. aij (0

nefu1109 游戏争霸赛(状压dp)

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰的人用0表示.倒着循环即可. //比赛的时候我用的是二维dp数组表示状态,一直是WA的,搞不懂原因...Orz... 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstrin

ZOJ3802 Easy 2048 Again (状压DP)

ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 Easy 2048 Again Time Limit: 2 Seconds      Memory Limit: 65536 KB Dark_sun knows that on a single-track road (which means once he passed this

zoj3802:easy 2048 again(状压dp)

zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<=500 , a[i]={2,4,8,16}: 分析: 首先明确一下自动合并的意思,比如原有 8,4,2,进入一个2 就会变成16 所以我们需要记录前面的所有数字..计算了一下发现最大情况,500个16会合成4096 =2^12 显然全部记录是不可能的.那么怎么处理呢 我们发现,只有递减的序列才有可能向前合

[BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP

题面 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i 行中从左到右第j 列的格 子上的两个整数记作\(A_{i, j}\).\(B_{i, j}\).在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的\

CF482C Game with Strings (状压DP+期望DP)

题目大意:甲和乙玩游戏,甲给出n(n<=50)个等长的字符串(len<=20),然后甲选出其中一个字符串,乙随机询问该字符串某一位的字符(不会重复询问一个位置),求乙能确定该串是哪个字符串的询问次数的期望值 这题不看题解好难想......(感谢zhx和zhx两位大佬的题解) len很小,考虑状压DP,显然我们要状压询问,要定义两个状态,f[]和num[] 1表示询问,0表示未询问 那么,我们定义f[s]表示询问状态s距离确定一个字符串所需要的期望值. 定义tot是s状态剩余的询问的次数,那么显

[DP总结]状压DP

顾名思义,是用将状态进行二进制压缩成集合的形式来方便DP转移的方法. 一些常用的代码表示如下 i & j //取状态i,j重合部分 i ^ j //取状态i,j不同部分 i | j //合并状态i,j (1 << N) - 1 //表示111-1(N个1) 1 << i - 1 //表示00100-0(1后面有i-1个0,也就是有且仅有二进制下第i位为1) for (int i = 0; i < n; ++ i) if (x & (1 << i))

[转]状态压缩dp(状压dp)

状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的知识. 1.'&'符号,x&y,会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值.例如3(11)&2(10)=2(10). 2.'|'符号,x|y,会将两个十进制数在二进制下进行或运算,然后返回其十进制下的值.例如3(11)|2(10)=3(11). 3.'^'符号,x^y

POJ 3254 Corn Fields 状压DP

链接:http://poj.org/problem?id=3254 题意:一块M*N的田地,每小块地大小是1*1,可以种植物的标记为1,不可以种植物的标记为0,并且相邻的两块地不可以同时种植物.问题是有多少种不同的种植方案(所有地都不种也是一种种植方案) 思路:这是第一道状压DP题,从第一行更新到最后一行,每一行用一个N位的二进制数来表示该行的状态1表示该位置种了植物,0表示该位置没种植物.因为每块地只对相邻的土地能否种植有所影响,所以每一行的状态可以用前一行的状态递推得到. 资料:http:/