zoukankan      html  css  js  c++  java
  • 动态规划算法的应用模型

    线性模型

    【例题】在一个夜黑风高的晚上,有n(n <= 50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是多少。

    思路1:贪心算法。总是跑得最快的人跑回来的话,那么他在每次别人过桥的时候一定得跟过去。但是,来看一组数据 四个人过桥花费的时间分别为 1 2 5 10,按照贪心算法答案是19,但是实际答案应该是17。

    具体步骤是这样的:

    第一步:1和2过去,花费时间2,然后1回来(花费时间1);

    第二歩:3和4过去,花费时间10,然后2回来(花费时间2);

    第三部:1和2过去,花费时间2,总耗时17。

    所以贪心想法是不对的。

    思路2:动态规划。

    我们先将所有人按花费时间递增进行排序,假设前i个人过河花费的最少时间为opt[i]。

    首先看初始状态:opt[0]=0,opt[1]=T[1], opt[2]=T[2]...

    再看最后状态:最后只可能有两种情况

    情况1:岸这边只剩一个人。最后渡河会是1和i一起渡河。

      状态转移方程:opt[i] = opt[i-1]+T[1]+T[i]

      其中opt[i-1]是i-1个人在对岸最少时间,所以此时手电筒必定在对岸;T[1]是送手电筒回来的时间;T[i]是最后渡河时间。

    情况2:岸这边只剩两个人。最后渡河会是1和2一起渡河。

      状态转移方程:opt[i] = opt[i-2]+T[1]+T[i]+T[2]+T[2]

      其中opt[i-2]是i-2个人在对岸最少时间,所以此时手电筒必定在对岸;T[1]是送手电筒回来的时间;T[i]是最后渡河时间(i为目前为止最后一个,所以必定比另一个人慢),第一个T[2]是送手电筒回来的时间;第二个T[2]是2和1一起渡河的时间。

    这两种最后情况其实对应的是:每个人可以选择与1一起渡河,也可以选择除1和2之外的一个人渡河。

    那么总的状态转移方程取这两者的最小值

    opt[i] = min{opt[i-1] + a[1] + a[i] , opt[i-2] + a[1] + a[i] + 2*a[2] }

    区间模型

    区间模型的状态表示一般为d[i][j],表示区间[i, j]上的最优解,然后通过状态转移计算出[i+1, j]或者[i, j+1]上的最优解,逐步扩大区间的范围,最终求得[1, len]的最优解。

    【例题】给定一个长度为n(n <= 1000)的字符串A,求插入最少多少个字符使得它变成一个回文串。

  • 相关阅读:
    vue 底层面试题
    js第二阶段的面试题
    vue新一轮的面试题
    vue3面试题
    day_33:后端day04Django框架中的视图和请求、响应
    day_37:后端day08Django框架前后端不分离模式实现项目管理系统(增删差改)
    day_36:后端day07Django框架中的ORM数据库操作二
    【漏洞复现】ThinkAdmin v5和v6 未授权列目录任意文件读取(CVE202025540)
    【超详细】安全测试===sqlmap使用心得(零)
    【最新】绕过Outlook 拦截钓鱼链接方式
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/5126573.html
Copyright © 2011-2022 走看看