刷题巩固-----DAY5(导弹防御系统)

题目链接

187. 导弹防御系统 - AcWing题库

对题干进行刨析,就是输入多组数据,求每组数据可拆分成严格单调上升子序列与严格单调下降子序列之和最小,如果直接沿用最长上升子序列模板的话,是不合适的,我们需要对模板进行优化,up[k]储存第k组上升子序列的末尾元素,down[k]储存第k组下降子序列的末尾元素。在整个过程中,我们先枚举每个数,先枚举将该数放到up[]中,还是down[]中,如果放到up[]中,则枚举该数到底要放到哪组上升序列后面,反之,枚举该数放到哪组下降序列后面。但是再拓展节点时存在贪心策略,降低了时间。

再此附上一瞬流年丶涅槃的代码

#include<iostream>
using namespace std;
const int N = 55;
int a[N], ans, up[N], down[N], n;
void dfs(int u, int d, int t)  //u表示上升的系统个数,d表示下降的系统个数,t表示第t个数
{
    if(u + d >= ans) return ;
    if(t ==  n){
        if(u + d < ans)ans = u + d;
        return ;
    }
    int i;
    for(i = 1; i <= u; i++)  //找到第一个末尾数小于a[t]的导弹系统
        if(up[i] < a[t])break;

    int temp = up[i];
    up[i] = a[t];//添加到该导弹系统中
    dfs(max(u, i), d, t + 1);
    up[i] = temp;  //恢复现场
    for(i = 1; i <= d; i++)//找到第一个末尾数大于a[t]的导弹系统
        if(down[i] > a[t])break;
    temp = down[i];
    down[i] = a[t];//添加到该导弹系统中去
    dfs(u, max(d, i), t + 1);
    down[i] = temp;//恢复现场
}
int main()
{
    while(scanf("%d", &n) != EOF && n != 0){
        ans = 100;
        for(int i = 0; i < n; i++)
            cin >> a[i];
        dfs(0, 0, 0);
        printf("%d\n", ans);
    }
    return 0;
}

作者:一瞬流年丶涅槃
链接:https://www.acwing.com/solution/content/4010/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值