最火的瓜,得用动态规划来吃

今天真是被罗志祥的大瓜砸到了!全网络都是关于“小猪”的新闻,这前女友公开吃瓜确实强悍!

“小猪”是怎么管理时间的?作为程序员,感觉这是一个很有技术的优化问题,称为动态规划~!
你不懂?
没关系,我快速教会你。

一、 递归树分析

直接掏出大杀器“递归树“”进行分析。
先来把数据整理一下:

愉悦度 = [60, 100, 120] 
时间成本 = [10, 20, 25] 
总时间 = 30
总人数 = 3

构造函数tm(总时间 , 时间成本 , 愉悦度 , 总人数),我们可以先分析c小姐:

在这里插入图片描述

无非两种情况,约和不约,如果在最优方案里面约c小姐,那你就应该在总时间30里面减去25,同时收获愉悦度+120,如果不约最优方案里面你可以使用的时间还是30。
不管你约或者不约,接下来我们都不用考虑c小姐对最优方案的影响了。
接下来我把完整的递归树画出来,因为空间问题,我省略了不变的时间成本和愉悦度参数。
在这里插入图片描述

这里需要说明的是比如b小姐的tm(5-20,1)这种情况,说明剩下的时间不满足约会b小姐,所以可以跳过这种情况,直接5小时保持不变,直接考虑下一种“总人数-1”的情况,本例中就是"1-1",所以下一种情况的表达函数就是tm(5, 0)。自然在这种情况下,也不能收获愉悦度。
还有就是当总人数为0,或者总时间为0的时候,我们直接返回0就好,这个时候的情况就是要么是没有人可以约了,要么就是没有时间可以约人了,所以也就没有办法收获愉悦度了。
`

二、 动态规划的代码

经过递归树的分析,如果规模比较大,你会发现有很多子问题都重复计算了,这个时候你就可以利用用空间换时间的思想去优化你代码的时间复杂度,这也就是动态规划的最后一步。
最开始直接用递归解决的代码

def tm(total_time , time_cost , profit , n): 
  
    if n == 0 or total_time == 0 : 
        return 0
    
    if time_cost[n-1] > total_time:
        res = ans(total_time , time_cost , profit , n-1) 
        
        return res
    else: 
        res =  max(profit[n-1] + tm(total_time-time_cost[n-1] , time_cost , profit , n-1), 
                   tm(total_time , time_cost , profit , n-1)) 
        
        return res
    
profit = [60, 100, 120] 
time_cost = [10, 20, 25] 
total_time = 30
n = len(profit) 

print(tm(total_time , time_cost , profit , n))

加上cache之后,从上到下进行优化的代码

def tm(total_time , time_cost , profit , n): 
  
    if n == 0 or total_time == 0 : 
        return 0
    if dp[n-1][total_time-1] != 0 :
        return dp[n-1][total_time-1]
    if time_cost[n-1] > total_time:
        res = ans(total_time , time_cost , profit , n-1) 
        dp[n-1][total_time-1] = res
        return res
    else: 
        res =  max(profit[n-1] + tm(total_time-time_cost[n-1] , time_cost , profit , n-1), 
                   tm(total_time , time_cost , profit , n-1)) 
        dp[n-1][total_time-1] = res
        return res
    
profit = [60, 100, 120] 
time_cost = [10, 20, 25] 
total_time = 30
n = len(profit) 
dp = [[0] * (total_time) for _ in range(n)] 
print(tm(total_time , time_cost , profit , n))

三、 与妹子沟通是个技术活

很多人做觉得算法只是解决工程问题,其实生活中的各种问题你都可以用算法的视角去观察。
只有这样你才会发现像“小猪”这样的高手!
时间是有限的,妹子是有限的,如何在有限的时间里与妹子最愉悦的在一起是一个技术活!

如果对动态规划感兴趣可以观察我的视频,持续更新中。

就这一次干翻动态规划 - Longest Common Subsequence

就这一次干翻动态规划 Longest Increasing Subsequence

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章