文章

211

粉丝

0

获赞

926

访问

31.3k

头像
拦截导弹 题解:
P1256 北京大学机试题
发布于2026年2月11日 16:00
阅读数 128

#include <bits/stdc++.h>
using namespace std;

int main() {    
    int k;  // 导弹数量    
    while (cin >> k) {
        vector<int> h(k);  // 存储每枚导弹的高度        
        for (int i = 0; i < k; i++) {
            cin >> h[i];
        }        
        // dp[i]表示:以第i枚导弹结尾(最后拦截的是第i枚),最多能拦截多少枚
        // 初始化为1,表示至少能拦截自己这一枚
        vector<int> dp(k, 1);      
        int ans = 1;  // 记录全局最大值,初始为1       
        // 动态规划:遍历每个位置作为结尾
        for (int i = 1; i < k; i++) {
            // 遍历i前面的所有位置j,看能否从j转移到i
            for (int j = 0; j < i; j++) {
                // 转移条件:第j枚的高度 >= 第i枚的高度
                // 即:前面拦截的导弹高度不低于当前导弹,才能继续拦截
                if (h[j] >= h[i]) {
                    // 状态转移:从j转移过来,拦截数量+1
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
            // 更新全局最大值
            ans = max(ans, dp[i]);
        }        
        cout << ans << endl;
    }   
    ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发