问题描述

植物大战僵尸这款游戏中,还有个特别有意思的赚钱方式——种花(能长金币的花)。
  种出来的金币需要玩家点击才能得到,或者,玩家可以购买一只蜗牛来帮助捡金币。然而,蜗牛爬得慢是众所周知的。所以,场上有若干金币时,蜗牛总是喜欢以最少的行程来捡走所有的金币。
  现在告诉你场上n个金币所在位置的坐标,以及蜗牛所在位置,让你求出蜗牛捡走所有金币的最小行程。

输入格式

第一行一个正整数n,表示金币数量
  之后n行,每行两个非负整数x、y,分别表示金币所在位置坐标
  最后一行两个正整数x、y表示蜗牛起始位置。

输出格式

一个实数(保留2位小数),表示最短行程

思路

dp[i][j]表示在第i个状态(经过哪些点,状压二进制表示),蜗牛在第j个点时的最短总长度。dp[i][j] = min(distance[m][j]+dp[n,m]) (m为i状态任一位为1的位置,n为i在二进制下m对应位设为0)

package ADV;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeSet;/***  种花*  http://lx.lanqiao.cn/problem.page?gpid=T788*   ac*/
public class ADV383 {static String[] s;static int n;static int[] x;static int[] y;static int sum;static double maxn = 200000000.0;static double[][] distance = new double[20][20];static double[][] f = new double[70000][17];static boolean[] vis;static TreeSet<Double> treeSet = new TreeSet<>();public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));s = in.readLine().split(" ");n = Integer.valueOf(s[0]);x = new int[n+1];y = new int[n+1];vis = new boolean[n+1];for (int i = 1; i <= n; i++) {s = in.readLine().split(" ");x[i] = Integer.valueOf(s[0]);y[i] = Integer.valueOf(s[1]);}s = in.readLine().split(" ");x[0] = Integer.valueOf(s[0]);y[0] = Integer.valueOf(s[1]);for(int i=0;i<=n;i++) {for(int j=i+1;j<=n;j++){distance[i][j]=countDisd(x[i], y[i], x[j], y[j]);distance[j][i]=distance[i][j];}}work();
//      search(0, 0);}static double DP(int now,int st)//递归{if(f[now][st]<maxn) return f[now][st];  //记忆化;for(int i=1;i<=n;i++){if((i!=st)&&((1<<(i-1))&now)!=0) //枚举上一次在哪里;1<<(i-1))&now)!=0意思是now的第i位不是0,即到过if[now][st]=Math.min(f[now][st],distance[i][st]+DP(now-(1<<(st-1)),i));//now-(1<<(st-1)) st位设为0}return f[now][st];}static void work()//递归倒着想,以每个金币为起点,经过所有金币来到蜗牛最初位置{double ans = 0x3f3f3f3f;for(int i=1;i<=n;i++) sum+=(1<<(i-1));//每个点都走过,用二进制有多少位个1for(int i=1;i<=sum;i++)for(int j=1;j<=n;j++)f[i][j]=maxn;//赋初值;for(int i=1;i<=n;i++)f[(1<<(i-1))][i]=0;//因为是倒着想,每个点都可能作为起始点,总长度0for(int i=1;i<=n;i++){ans=Math.min(ans,distance[0][i]+DP(sum,i)); //倒着想,走完所有点后从i点到0点}System.out.printf("%.2f",ans);}//    static void search(int point,double len) {//暴力搜索 70分
//      boolean flag = false;
//      for (int i = 1; i <= n; i++) {//          if(vis[i])
//              continue;
//          flag = true;
//          double temp = countDisd(x[point],y[point],x[i],y[i]);
//          vis[i] = true;
//          search(i, len+temp);
//          vis[i] = false;
//      }
//      if(!flag) {//          treeSet.add(len);
//      }
//  }static double countDisd(int x1,int y1,int x2,int y2) {return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
}

蓝桥杯 种花小游戏 java 状压相关推荐

  1. 2021 第十二届 蓝桥杯 国赛决赛 Java B组 真题 详细解析

    文章目录 2021 第十二届 Java B组 国赛 真题答案 详细解析 试题A: 整数范围 答案:255 分析: Code: 试题B: 纯质数 答案:1903 分析: Code: 试题C: 完全日期 ...

  2. c语言奇怪的分式11,蓝桥杯-奇怪的分式-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  3. 2020十一届蓝桥杯国赛二等奖Java B组

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 参考博客https://blo ...

  4. java实验2总结心得,打字小游戏JAVA实验总结及心得体会

    篇一:扫雷游戏实验报告 课程设计 班 级: 姓 名: 学 号: 指导教师: 成 绩: 电子与信息工程学院信息与通信工程系 目录 1.任务概述------------------------------ ...

  5. java小游戏-java小游戏-大鱼吃小鱼

    java小游戏-java小游戏-大鱼吃小鱼 1 创建窗口 2 添加背景图 3 启动封面 4 启动页面的点击事件 5 游戏开始时的背景添加 6 双缓存解决闪屏问题 7 地方第一条小鱼的添加 8 敌方左方 ...

  6. java蓝桥杯加法变乘法_蓝桥杯-加法变乘法-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  7. java小游戏-java小游戏-飞机大战

    java小游戏-java小游戏-飞机大战 1 窗口创建 2 背景图片添加 3 启动页面制作 4 启动页面点击事件 5 游戏物体父类的编写 6 背景的移动 7 双缓存的添加 8 背景图片的循环出现 9 ...

  8. 贪吃蛇小游戏java实现代码分析

    贪吃蛇小游戏java实现代码分析 贪吃蛇的小游戏,网上的代码比较多,今天周五,在教研室没啥事做,在电脑中发现了一个贪吃蛇的小游戏,于是就看了下实现的源码,发现别人写的代码确实挺好的,自己也是边加注释边 ...

  9. java 猫 游戏,crazycat 围住神经猫-小游戏-Java源码 联合开发网 - pudn.com

    crazycat 所属分类:Java编程 开发工具:Java 文件大小:1373KB 下载次数:1 上传日期:2019-01-19 21:03:14 上 传 者:lynnhl 说明:  围住神经猫-小 ...

  10. java小游戏-java小游戏-黄金矿工

    java小游戏-java小游戏-黄金矿工 1 窗口绘制 2 绘制图片 3 红线绘制 4 红线摇摆 5 红线抓取 6 创建金块 7 双缓存技术 8 抓取判断 9 抓取返回 10 多个金块 11 Bug金 ...

最新文章

  1. Python 连接Sql Server数据库 MSSql
  2. python中的装饰器有哪些-python中的装饰器
  3. Git之 手把手教你使用Git
  4. ef mysql dbfirst,.NetCore教程之 EFCore連接Mysql DBFirst模式
  5. 前端学习(1801):前端调试之清除浮动练习3
  6. maven 公共模块依赖_Maven 子模块 依赖 springboot 子模块的问题
  7. 作者:桑基韬(1985-),男,博士,中国科学院自动化研究所副研究员
  8. Transformer 这么强,该从何学起?
  9. tensorflow2实现unet, 完成眼底血管分割任务
  10. 【169天】黑马程序员27天视频学习笔记【Day08-上】
  11. 快速掌握——LCD1602液晶显示(多组实验,附带源程序)
  12. HTML技术(基础/列表/表格/表单)
  13. 如何用软件测试交易系统的胜率,通达信官网程序交易测试
  14. JavaScript/Js 大全
  15. LeaRun .Net Core/Java工作流引擎,分离式前端,升级Vue
  16. 计算机说话技巧,每天学点说话技巧,让你成为一个沟通达人
  17. 这4类人去创业和自由职业会死得很惨
  18. Mac下command+R和shift+command+R的区别,在线恢复模式的选择
  19. 等了20年的物联网,这次真的会成功吗?
  20. SnowNLP使用自定义语料进行模型训练(情感分析)

热门文章

  1. bpm js 计算 音乐_大量带BPM的跑步歌曲/跑步音乐下载
  2. 【面经】数据开发一面-美团暑期实习
  3. 树莓派hdmi输出没声音_如何解决外接Hdmi没有声音的问题
  4. 股市财富神话背后:黑庄黑嘴制造多少黑洞
  5. python学习:用两种思路计算质数与合数
  6. java string替换最后一个字符_sed替换每行最后一个字符
  7. 深入浅出Embedding
  8. 主板风扇转不开机是什么问题_cpu风扇转主板不启动怎么办
  9. 序列号生成-模拟windows office序列号
  10. [K8S] PV动态供给