听说你会打地鼠(动态规划dp)
题目来源:https://biancheng.love/contest-ng/index.html#/41/problems
G 听说你会打地鼠
时间限制:300ms 内存限制:65536kb
题目描述
打地鼠是个很简单的游戏,不过你知道怎么打地鼠才能最省力吗?
每时刻,都有N只地鼠在pi(xi,yi)位置出现,打掉一只,该时刻其他地鼠会消失。
打掉第一只地鼠不消耗能量,之后每只地鼠消耗的能量约与鼠标移动距离成正比,即cost = dis(pi,pi+1)(平面上两点距离怎么求不多说了)
现在认为打第一只地鼠不消耗能量,那么打完所有地鼠消耗的最小能量是多少?
输入
多组测试数据
每组测试数据第一行两个整数为时长K和每时刻地鼠数量N
接下来N行每行2N个整数表示N只地鼠坐标
N<=100,K<40
输出
对于每组数据,输出一行,为最小消耗,结果保留3位小数
输入样例
2 2
1 1 3 4
2 2 5 3
输出样例
1.414
解题思路:
状态转移方程:
dp[k][i]=dp[k-1][j]+cost(p[k][i],p[k-1][j]);
说明:dp[k][j] 表示打第k层第j个的时候所能得到的最小值
给出代码:
#include <bits/stdc++.h>
#define INF 9999999999 using namespace std;
struct Point{
double x;
double y;
}; double cost(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} Point p[][];
double dp[][];
int k,n,i,j,f;
double ans;
int main()
{
while(~scanf("%d%d",&k,&n))
{
ans=INF;
for(i=;i<k;i++)//k层
{
for(j=;j<n;j++)//n个
{
scanf("%lf%lf",&p[i][j].x,&p[i][j].y);//x表示层数,y表示第几个,因此p[x][y]可以确定所选择的地鼠层数以及在该层的位置
}
}
for(f=;f<k;f++)
{
for(i=;i<n;i++)
{
dp[f][i]=INF;
}
}
// memset(find_min,INF,sizeof(find_min));
for(f=;f<n;f++)
{
dp[][f]=;//第一只不需要消耗能量
}
for(f=;f<k;f++)//第f层
{
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(dp[f][i]>(dp[f-][j]+cost(p[f][i],p[f-][j])))//状态转移方程
dp[f][i]=dp[f-][j]+cost(p[f][i],p[f-][j]);//在第f层最小消耗能量等于在第f-1层打第j个地鼠+两点之间距离
}
}
}
for(i=;i<n;i++)
{
if(ans>dp[k-][i])
ans=dp[k-][i];
}
printf("%.3lf\n",ans);
}
}
推荐博客:http://www.tuicool.com/articles/QV7rQjZ
听说你会打地鼠(动态规划dp)的更多相关文章
- 动态规划dp
一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...
- 算法-动态规划DP小记
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...
- Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)
题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...
- 【转】动态规划DP
[数据结构与算法] DP 动态规划 介绍 原创 2017年02月13日 00:42:51 最近在看算法导论. DP全称是dynamic programming,这里programming不是编程,是一 ...
- 动态规划DP的优化
写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里 ...
- hdu 1421:搬寝室(动态规划 DP + 排序)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 2059:龟兔赛跑(动态规划 DP)
龟兔赛跑 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- 动态规划DP入门
百度百科↓ 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman ...
- hdu 1087 Super Jumping! Jumping! Jumping!(动态规划DP)
Super Jumping! Jumping! Jumping!Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
随机推荐
- Linux的段错误调试方法
linux段错误的调试方法 相关博文: http://blog.csdn.net/htianlong/article/details/7439030 http://www.cnblogs.com/pa ...
- LeetCode——Find the Duplicate Number
Description: Given an array nums containing n + 1 integers where each integer is between 1 and n (in ...
- C++中指针常量和常量指针的区别
在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫 ...
- 警惕SQL语句陷井
以下SQL段,大家认为结果是什么呢? DECLARE @A VARCHAR(50) SET @A='Zuowenjun.cn' SELECT TOP 1 @A=ISNULL(FIELDNAME,'DE ...
- Spring基础——在Spring Config 文件中配置 Bean
一.基于 XML 的 Bean 的配置——通过全类名(反射) <bean <!-- id: bean 的名称在IOC容器内必须是唯一的若没有指定,则自动的将全限定类名作为 改 bean 的 ...
- 订餐App回顾与总结
MY-HR 成员: 角色分配 学号 博客园 丘惠敏 PM项目经理 201406114203 http://www.cnblogs.com/qiuhuimin/ 郭明茵 用户 201406114204 ...
- 详细讲解PHP中缓存技术的应用
PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2 ...
- 关于SVN删除后的文件不能重新添加(正常途径不行)
在你自己的机器上(即SVN客户端),把“新建test”文件夹标记为删除,然后提交,在删除之前可以备份“新建test”文件夹,提交后,在当前文件夹下更新SVN.然后把你刚刚备份的文件夹重新放到该目录下. ...
- WinForm给控件加入hint文字
本文代码主要是参考别人的,仅为个人记录,方面后续使用~ 效果图: 主要代码在一个Win32Utility类中,代码如下: public static class Win32Utility { [Dll ...
- 用于dbnull的数据转换。因为用convert.to无法转换dbnull类型
/// <summary> /// add by wolf /// </summary> public static class ExtendObject { public s ...