zoukankan      html  css  js  c++  java
  • 青蛙的烦恼(dp好题)

    有n片荷叶正好在一凸多边形顶点上
    有一只小青蛙恰好站在1号荷叶的点
    小青蛙可以从一片荷叶上跳到另外任意一片荷叶上
    给出N个点的坐标N<800
    求小青蛙想通过最短的路程遍历所有的荷叶一次且仅一次的最短路径。
     
    这题如果没有凸多边形的性质,就是裸的TSP问题,数据范围没法做的很大,用dp做也最多做到n=20左右,即使用更高级的退火模拟算法也只能到40左右。
    但是这题的点在凸多边形上,因此有下面的性质:
    青蛙遍历的路径不会相交。
    证明很简单,画个图,利用三角形两边之和大于第三边即可。
     
    结论:青蛙在1号结点只能跳到2号结点或者n号结点。
    如果青蛙跳到了2号结点,则问题转化为:从2出发,遍历2..n一次仅一次的最短距离。
    如果青蛙跳到了n号结点,则问题转化为:从n出发,遍历2..n一次仅一次的最短距离。
    这实际上是递归的思维,把问题转化为了本质相同但规模更小的子问题;
    F(s,L,0)表示从s出发,遍历s..s+L-1一次且仅一次的最短距离;
    F(s, L,1)表示从s+L-1出发,遍历s..s+L-1一次且仅一次的最短距离。状态转移方程为:
    F[s][L][0]=min{F[s+1][L-1][0]+dist[s][s+1],F[s+L-1][L-1][1]+dist[s][s+L-1]};
    F[s][L][1]=min{F[s][L-1][1]+dist[s+L-1][S+L-2],F[s][L-1][0]+dist[s][s+L-1]};
     
     
    Every day is meaningful, keeping learning!
  • 相关阅读:
    Flink Task 并行度
    flink笔记(三) flink架构及运行方式
    Flink笔记(二) DataStream Operator(数据流操作)
    poj 1463 Strategic game
    2014年3月29日小记
    AC自动机学习
    hdu 1028 Ignatius and the Princess III
    hdu 1542 Atlantis
    hdu 1575 Tr A
    hdu 4193 Non-negative Partial Sums
  • 原文地址:https://www.cnblogs.com/vb4896/p/3895845.html
Copyright © 2011-2022 走看看