zoukankan      html  css  js  c++  java
  • hdu2059 龟兔赛跑 DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059

    虽然 知道是DP ,刚开始一直没有想出状态转移方程。

    刚开始的思路就是定义dp[i]表示到达第i个加油站的最优时间,但是却一直在想其与在第i-1的加油站加油和不加油之间的转移关系

    后来看别人的思路,觉得自己又弱了,应该是考虑和前面的所有加油站的关系

    对于每一个站点i, 我们可以假设在j (0<=j<i) 满电出发,那么:

    如果i到j的距离小于c, 就可以从j一直骑到i

    如果i到j的距离大于c, 要骑一段蹬一段

    状态转移方程就很好写了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 using namespace std;
     6 double d[110];
     7 double dp[110];
     8 void init()
     9 {
    10         memset(d,0,sizeof(d));
    11         for(int i=0;i<110;i++)
    12                 dp[i]=10001010;
    13 
    14 }
    15 int main()
    16 {
    17      double l;
    18      while(scanf("%lf",&l)!=EOF)
    19      {
    20            
    21              init(); 
    22              int n;
    23              double c,t;
    24              double vr,v1,v2;
    25              cin>>n>>c>>t;
    26              cin>>vr>>v1>>v2;
    27              for(int i=1;i<=n;i++)
    28                      scanf("%lf",&d[i]);
    29                      d[0]=0;
    30                      d[n+1]=l;
    31              double s;
    32              dp[0]=0;
    33              for(int i=1;i<=n+1;i++)
    34                      for(int j=0;j<i;j++)
    35                              {
    36                                      s=d[i]-d[j];
    37                                      if(s<=c)
    38                                      dp[i]=min(dp[i],dp[j]+s/v1+t);
    39                                      else
    40                                      dp[i]=min(dp[i],dp[j]+c/v1+(s-c)/v2+t);
    41                              }
    42             double t1=l/vr;
    43             dp[n+1]=dp[n+1]-t;
    44            if(t1>dp[n+1]) cout<<"What a pity rabbit!"<<endl;
    45            else cout<<"Good job,rabbit!"<<endl;
    46      }
    47      return 0;
    48 }
    View Code

    代码:

  • 相关阅读:
    词法分析
    HTTP学习笔记
    Servlet入门
    UDP与TCP的区别
    C语言实现血型查询系统
    Mysql的索引、回表查询及覆盖索引浅析
    ReentranLock浅析
    CAS是个什么鬼?
    synchronize和volatile 小知识点总结
    写一个简单的阻塞队列
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu2059.html
Copyright © 2011-2022 走看看