• 某题4


    “从左到右再回来”不太方便思考,可以改成:两个人同时从最左点出发,沿着两条不同
    的路径走,最后都走到最右点,且除了起点和终点外其余每个点恰好被一个人经过。这样,
    就可以用(d(i,j))表示第一个人走到(i),第二个人走到(j),还需要走多长的距离。
    状态如何转移呢?仔细思考后会发现:好像很难保证两个人不会走到相同的点。例如,
    计算状态(d(i,j))时,能不能让(i)走到(i+1)呢?不知道,因为从状态里看不出来(i+1)有没有被j走
    过。换句话说,状态定义得不好,导致转移困难。
    下面修改一下:(d(i,j))表示(1~max(i,j))全部走过,且两个人的当前位置分别是i和j,还需
    要走多长的距离。不难发现(d(i,j)=d(j,i)),因此从现在开始规定在状态中(i>j)。这样,不管是
    哪个人,下一步只能走到(i+1,i+2,cdots)这些点。可是,如果走到(i+2),情况变成了“(1~i)(i+ 2),但是(i+1)没走过”,无法表示成状态!怎么办?禁止这样的决策!也就是说,只允许其中
    一个人走到i+1,而不能走到(i+2,i+3,cdots ,)。换句话说,状态(d(i,j))只能转移到(d(i+1,j))(d(i+ 1,i) (4))
    可是这样做产生了一个问题:上述“霸道”的规定是否可能导致漏解呢?不会。因为如果
    第一个人直接走到了i+2,那么它再也无法走到i+1了,只能靠第二个人走到i+1。既然如
    此,现在就让第二个人走到i+1,并不会丢失解。
    边界是(d(n-1,j)=dist(n-1,n)+dist(j,n)),其中(dist(a,b))表示点(a)(b)之间的距离。因为根据
    定义,所有点都走过了,两个人只需直接走到终点。所求结果是(dist(1,2)+d(2,1)),因为第一
    步一定是某个人走到了第二个点,根据定义,这就是(d(2,1))
    状态总数有(O(n^2))个,每个状态的决策只有两个,因此总时间复杂度为(O(n^2))

  • 相关阅读:
    string.format()详解
    微信支持的Authorization code授权模式(公众号开发)(开放平台资料中心中的代公众号发起网页授权)
    HttpClient类详解
    PostgreSQL按年月日分组(关键词:extract time as Year/Month/Day)
    sql中的(case when then else end )的用法(相当于java中的if else)
    模板题 Problem I Link Cut Tree
    BZOJ2555 SubString
    poj3264(简单线段树)
    poj1011(DFS+剪枝)
    poj1042(贪心+枚举)
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/7803166.html
Copyright © 2020-2023  润新知