问题描述:
某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。
输入:
导弹依次飞来的高度 [h1, h2, h3,…hn]
输出:
最多能拦截的导弹数目
思路:
导弹飞来,我们可以选择拦截或者不拦截,但拦截第一次后,后面的拦截高度受限。一次拦截结果是成功/失败,我们需要将拦截成功次数score最大化。
1 拆分子问题
一次拦截结果是成功或者失败,score可加1或保持不变。对第i个导弹,拦截它的次序可能是第1次,第2次。。。第i次,所以我们需要计算的是第1次,第2次。。。第i次拦截的成功次数
2 得分计算
第i次拦截的成功次数为 S(i) = max(S(j)+shootScore(i,j+1)) ,其中,1<=j<i,shootScore(i,j+1)表示当第i个导弹飞来,我们已经进行了j次拦截,第j+1次拦截的成功/失败,成功为1,失败为0,初始值S(1)=1
3 时间复杂度
拆分出的子问题个数是n,第i个子问题需要考虑i-1种情况,计算shootScore(i,j+1)需要进行i-j-1次计算,所以时间复杂度为O(n3)
4 代码