拦截导弹

拦截导弹

http://www.nowcoder.com/questionTerminal/dad3aa23d74b4aaea0749042bba2358a

思路

首先先捋清一下题意:有若干发炮弹,拦截系统拦截的导弹的高度必须是递减的,那这道题就变成了最长下降子序列了,和下面一道题类似,用动态规划求解。

用 dp[i] 表示以 i 结尾的子序列的最长长度,那么状态转移方程为:

#include<iostream>
#include<vector>

using namespace std;


int main(){
    int k;
    while(cin >> k){
        vector<int> height(k, 0);
        for(int i = 0; i < k; i ++)
            cin >> height[i];
        vector<int> dp(k, 1);
        int ans = 0;
        for(int i = 0; i < k; i ++){
            for(int j = 0; j < i; j ++)
                if(height[j] >= height[i])
                    dp[i] = max(dp[i], dp[j] + 1);
            ans = max(ans, dp[i]);
        }
        cout << ans << endl;
    }
    return 0;
}
算法题解 文章被收录于专栏

不定期更新一些算法题解,有什么问题可以随时留言~

全部评论

相关推荐

昨天 19:16
Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
09-17 17:09
门头沟学院 Java
雨忄:有人给出过解法,拖晚点去,然后到时候再找其他理由商量,既增加他们的筛人成本,不一定会给你收回offer ,也能占位避免工贼
秋招的嫡长offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务