动态规划解决hdu龟兔赛跑

import java.util.Scanner;

class test {
    private double dp[];//用来存储每段的最短时间
    private double p[];//用来存储每个充电站点离起点的距离
    private int n,c,t;
    private double vr,vt1,vt2;
    private double Length;

    public boolean Solution(){
        System.out.print("请输入每个站点离起点的距离:");
        Scanner iner=new Scanner(System.in);
        for(int i=1;i<=this.n;++i){
            p[i]=iner.nextInt();
        }
        double curTime=0;
        for(int i=1;i<=this.n+1;++i){
            double minTime=100000.0;
          for(int j=0;j<i;++j){
            if(c>p[i]){   //判断充满电后的距离能不能直接过站点
                curTime=p[i]/vt1;
            }else{
                curTime=c/vt1+(p[i]-c)/vt2;   //不加油的时间
            }
            //过站点时要分两种情况--一是加油,二是不加油
            if(j>0){    //考虑加油的情况
                 //1.加油时间上,加t秒
                 //2.提速时间上,减x秒
                 curTime=dp[i-1];
                 curTime+=t;
                if(p[i]-p[i-1] > c){
                  curTime+=c/vt1+(p[i]-p[i-1]-c)/vt2;
                }
                else{
                  curTime+=(p[i]-p[i-1])/vt1;
                }
            }
            if(curTime<minTime){     //然后再对两者进行比较
                minTime=curTime;
            }
          }
          dp[i]=minTime;
        }
        int Time= (int) (this.Length / vr);
        if(dp[this.n+1]<Time){
            System.out.println("What a pity rabbit!");
        }else{
            System.out.println("Good job,rabbit!");
        }
        iner.close();
        return true;
    }

    public test(int l,int x,int y,int z,int k,int m,int n){
      this.Length=l;
      this.n=x;this.vr=k;
      this.c=y;this.vt1=m;
      this.t=z;this.vt2=n;
      p=new double[this.n+2];
      dp=new double[this.n+2];
      p[0]=0;p[this.n+1]=l;
    }
}

public class rabbit{
    public static void main(String[] args) {
        test space=new test(100,3,5,1,10,20,5);
        space.Solution();
    }
}

原文地址:https://www.cnblogs.com/z2529827226/p/11624553.html

时间: 2024-08-01 23:17:28

动态规划解决hdu龟兔赛跑的相关文章

动态规划解决最长公共子序列问题(转)

原文链接 动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加. 解决思想: 为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法. [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后

动态规划解决0-1背包问题

这几天算法老师布置了一个作业是关于背包问题的,在这里记录一下解决的过程: 一:背包问题的描述 有n1,n2,n3....个物品,每个物品的重量为w1,w2,w3.....,每个物品的价值为v1,v2,v3....,现在有一个承重量为C的背包,求出要怎样放物品才能使的装入背包的物品价值总和最大.由于每个物品只有一个,并且只能选择放或不放,因此用0表示物体没有放进背包中,1表示物体放进背包中 二:分析过程(以具体的例题来分析) 题目描述: 现有一个可以承重为6的背包bag,以及3个物品,它们的重量分

【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意: 一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走.求(N+M-1)ΣN+M-1(Ai-Aavg)2最小.Aavg为平均值. (N,M<=30,矩阵里的元素0<=C<=30) 题目思路: [动态规划] 首先化简式子,得原式=(N+M-1)ΣN+M-1(Ai2)-(ΣN+M-1Ai)2 f[i][j][k]表示走到A[i][j]格子上,此时前i+j-1

【动态规划】HDU 5791 Two

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 题目大意: A,B两个数列,问A的子集和B的子集相等的子集对数.子集内顺序按照数列顺序,相同的数字视为不同. 题目思路: [动态规划] f[i][j]表示A前i个数,B前j个数且第j个数必取的值.g[i][j]表示j不一定必取得值. ans=∑f[n][j]. 1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<ios

【动态规划】HDU 5781 ATM Mechine

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 题目大意: 一个人有[0,K]内随机的钱,每次可以随意取,但是不知道什么时候取完,取钱超过剩余额度会警告一次,最多警告不能超过W.求期望取出钱的次数. 题目思路: [动态规划] 二分居然错了...看来二分出的答案不一定最优..起码第三个样例过不去. f[i][j]表示钱在[0,i]区间内,警告次数不超过j的期望取钱次数.那么取一次钱k相当于把钱分成两块,[0,k]和[k+1,i],即[0,k

动态规划解决台阶问题求解

问题描述: 给定n级台阶,每次走1,2,3步,求解所有可走步骤 8个台阶,上台阶的人一次最多上3个台阶,问上这个8个台阶有多少种方法? 解题思路: 采用动态规划的思想,将大问题划分为若干个子问题,然后递归的解决每个可能的子问题. 首先,先考虑corner case: 1. 当只有一个台阶,那么有1种走法: 2. 当前只有两个台阶,那么有2种走法: 3. 当前有三级台阶,那么就存在4种走法: 接下来就要考虑如何划分子问题,在划分子问题的时候,存在三种情况,分别为: 1. 当前状态走一个台阶, 需要

python动态演示动态规划解决矩阵连乘

矩阵连乘:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1.确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少.输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数. 若A是一个p*q的矩阵,B是一个q*r的矩阵,则其乘积C=AB是一个p*r的矩阵.数乘次数是p*q*r. 动态规划算法与分治法类似,其基本思想也就是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,简

动态规划解决“最大子数组”问题

TODO: 动态规划到底是个什么玩艺? ref:http://www.cnblogs.com/waytofall/archive/2012/04/10/2439820.html I 只考虑怎样产生更大的子组和: 假设处理到第i个节点时: 1. 考虑是否i节点是否可使子组的和变大 a) 如果i节点大于0,则最大子组和是前面求到的数组和 加上 i节点值 b) 如果i节点小于0(等于0的话,值可以带上i,也可以不带上i,无所谓),当最大子数组的和是前面求的子组和 2. 然后考虑最大值是否应该更新了 a

【动态规划】HDU 1081 &amp; XMU 1031 To the Max

题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1031 题目大意: 给一个n*n(n<=100)的矩阵,求一个矩形覆盖的值最大是多少. 题目思路: [动态规划] 二维的最大字段和.先考虑一维的情况.f[i]=max(f[i-1]+a[i],a[i]) 只要之前的部分和大于零则一起取一定比只取当前位置的要优. 因此只要判断局部段的和是否大于零.同时每多取一个数就要更新答案. 之后只要将一维扩展到二维就行.枚举行的始末位置. 1 //