重启系统

题目描述:

小明帮助管理一个处理数据的计算系统,有N个待处理的任务,需要按照顺序来完成这些任务, 即每次所完成任务的编号都要大于前一个完成任务的编号,且单个任务不可以分解完成。计算系统运行着一个奇怪的保护程序, 它限制了系统当前所能处理的数据量不能超过上次完成任务所处理的数据量。重启系统可以使它立刻恢复到最高性能(一开始系统拥有最高性能, 最高性能大于任何待处理任务的数据量)。小明有一次重启系统的权限(也可以不使用),你能帮他算出最多能完成几个任务吗?

输入:

第一行: N (2 <= N <= 1000) 待处理的任务数 第二行: N个整数,每个任务的数据量

输出:

输出只包括一行,这一行只包含一个整数,表示最多能完成的任务数。

样例输入:

10
1 5 4 3 2 10 9 8 7 6

样例输出

9 

代码

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

int a[1005];
int dpl[1005],dpr[1005];
//dpleft从左往右,dpright从右往左 
int main(){
    int n;
    scanf("%d",&n);
    for (int i = 1;i <= n;i++){
        scanf("%d",&a[i]);
        dpl[i] = 1;
        dpr[i] = 1;
    }//输入以及初始化 
    for (int i = 1;i <= n;i++){
        for (int j = 1;j < i;j++){
            if(a[i] <= a[j] ){
                dpl[i] = max(dpl[i],dpl[j] + 1);
            }
        }
    }//从左往右dp 
    for (int i = 2;i <= n;i++){
        dpl[i] = max(dpl[i],dpl[i-1]);
    }//满足dp含义的处理 
    for (int i = n; i >= 1;i--){
        for (int j = n;j > i;j--){
            if(a[i] >= a[j]){
                dpr[i] = max(dpr[i],dpr[j]+1);
            }
        }
    }
    for (int i = n-1;i >= 1;i--){
        dpr[i] = max(dpr[i],dpr[i-1]);
    }//同上,改成从右往左dp 
    int ans = 0;
    for (int i = 1;i <= n;i++){
        ans = max(ans,dpl[i] + dpr[i+1]);//这里dpr要+1是防止有可能取到相同的 
    }
    cout<<ans;
    return 0;
}

小编蒟蒻一个,有什么问题请大佬不惜赐教Orz

posted @ 2022-03-08 21:33  骆美辰  阅读(109)  评论(0编辑  收藏  举报
lock: { enable: true, background: 'https://img1.baidu.com/it/u=2788089125,168843488&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1690563600&t=35fa4326e773b3fbf83562ad746b7cd2',//锁屏背景 strings: [ 'Every win named never give up 每一份胜利都叫不放弃',//签名 ], },