这个题一开始不知道咋做,但是大致有点意思。后来还是借鉴了题解发现可以用dijkstra,不太理解。但是在最后自己推的时候突然理解了。

dijkstra应该也算是动态规划。我们用dis[i]数组作为青蛙跳到第i个石头时途经的最大跳跃距离。借鉴dijkstra的思路,先找最小的dis[i].然后i作为中间点修改dis[j],

1<=j<=n;并且U[i]==0;那么对于修改的时候对于点j如果dis[j]>max(dis[i],arcs[i][j]),那么肯定有修改的必要,新的dis[i]=max(dis[i],arcs[i][j])。至于为什么可以这样呢,其实是和dijkstra的证明类似的,但是这里有一个简单的思路。因为我们一开始对于每个点就有最初的dis[j],当我们可以借助中间点逐渐优化的时候,那么dis[j]肯定是越来越优化的,直到结束。其实这样想有点像floyd。动态规划真的是神奇啊!

Ps:今天历经坎坷,终于组队了。虽然水平都不高,但是距离区域赛还有6个月!we can make it!

 #include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const double Pi=3.14159265358979323846;
typedef long long ll;
const int MAXN=+;
const int dx[]={,,,-};
const int dy[]={,-,,};
const int INF = 0x3f3f3f3f;
const int NINF = 0xc0c0c0c0;
const ll mod=1e9+;
struct graph
{
double weight;
double arcs[MAXN][MAXN];
}G;
struct node{
int a,b;
}p[MAXN];
double dis[MAXN];
//v是起点,n是一共的点的个数
//dis[i]记录的是从七点到i,所有路径中的最小单步值
void dijkstra(int v,int n)
{
int U[MAXN];
for(int i=;i<=n;i++) U[i]=;
for(int i=;i<=n;i++) dis[i]=INF; dis[v]=; for(int i=;i<=n;i++)
{
double minn=INF;int k=-;
/*for(int j=1;j<=n;j++)
{
cout <<dis[j]<<" ";
}
cout <<endl<<"**********"<<endl;*/
for(int i=;i<=n;i++)
{
if(minn>dis[i]&&U[i]==)
{
minn=dis[i];
k=i;
}
}
U[k]=; for(int i=;i<=n;i++)
{
if(U[i]==&&dis[i]>max(G.arcs[i][k],dis[k]))
{
dis[i]=max(G.arcs[i][k],dis[k]);
}
}
}
}
int main()
{
int n;int cnt=;
while(scanf("%d",&n)&&n)
{
for(int i=;i<=n;i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
}
for(int i=;i<n;i++)
{
for(int j=i+;j<=n;j++)
{
G.arcs[i][j]=sqrt((p[i].a-p[j].a)*(p[i].a-p[j].a)+(p[i].b-p[j].b)*(p[i].b-p[j].b));
G.arcs[j][i]=G.arcs[i][j];
}
}
dijkstra(,n);
printf("Scenario #%d\n",cnt++);
printf("Frog Distance = %.3f\n\n",dis[]);
}
return ;
}

最新文章

  1. Dom addEventlistener与id 绑定事件的区别(续)
  2. VC++ error C2248: &ldquo;CObject::CObject&rdquo;: 无法访问 private 成员(在&ldquo;CObject&rdquo;类中声明)
  3. 【原创】MYSQL++源码剖析&mdash;&mdash;前言与目录
  4. linux创建线程之pthread_create
  5. IDEA系统提示中文乱码问题及解决
  6. 得到JAVA项目根文件夹
  7. js 实现自动换行
  8. c语言编程实例——小球跳动
  9. IE/Chrome背景图片居中1px偏移解决方法
  10. Redis入门必读,The Little Redis Book中文版
  11. 简单的Web日志处理细节
  12. selenium定位方式-获取标签元素:find_element_by_xxx
  13. spring事务管理方式,aop
  14. shell脚本的多线程
  15. 常用Macro
  16. DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板
  17. Windows 10更新后频繁死机、假死(SSD)
  18. bzoj4720 / P1850 换教室(Floyd+期望dp)
  19. 自定义MVC框架之工具类-文件上传类
  20. 关于manacher

热门文章

  1. java⑩
  2. Python Oracle连接与操作封装
  3. TensorFlow学习笔记——节点(constant、placeholder、Variable)
  4. SignalR 前期简单配置
  5. Java基础-类和对象
  6. mybatis学习(五)----实现关联表查询
  7. Linux 配置selenium + webdriver 环境
  8. background低版本安卓浏览器不支持复合属性,要分开写
  9. VS2010,MFC动态按钮和窗体背景图片,以及是静态文字控件透明,并避免静态文字刷新出现的重叠问题
  10. mac下python2.7升级到3.6