UVA 10003

这两天状态太囧了……看啥啥不会,做啥啥WA……这题就纠结了我好几小时

 

 

题目是经典DP,和矩阵相乘的最小乘法次数那个是一样的

 

f[i,j]=min{f[i,k]+f[k,j]}+j-i (k是i,j之间的木棍切割点)

 

f[0,L]就是答案。由于划分阶段貌似比较困难,于是毫不犹豫的使用记忆化搜索

开始的时候f数组开了1000*1000(由于L最大为1000),然后转移状态的时候从把所有的切割点过一遍,复杂度是O(kn^2),k<50,n<1000,照理讲完全没有问题,自己试了最大的数据也是秒杀。

于是提交,居然TLE— —

囧大了,上网看别人怎么说的。有人发现这题的test case奇多无比,很容易超时。

但是算法没问题,看看能不能优化下细节

于是尝试在状态转移时候的那个for循环上做文章,结果种种尝试均失败了……

 

找到个别人的code来参考下,发现dp的状态数居然是50*50

仔细一想,确实是这么回事……居然一直都没发现

改写之后1秒AC了……一次最多算50*50*50次的dp居然花了近1秒……他到底用了多少数据呃……

 

不过之前用那个1000*1000数组的时候也只用到了50*50的空间,状态并没有变多

超时的可能性大概在每次dp前的初始化上……那个初始化1000*1000数组的时间比dp的还要长……

果然是状态问题…………早点休息吧……

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值