重启系统(动态规划)
题目描述:
小明帮助管理一个处理数据的计算系统,有N个待处理的任务,需要按照顺序来完成这些任务, 即每次所完成任务的编号都要大于前一个完成任务的编号,且单个任务不可以分解完成。计算系统运行着一个奇怪的保护程序, 它限制了系统当前所能处理的数据量不能超过上次完成任务所处理的数据量。重启系统可以使它立刻恢复到最高性能(一开始系统拥有最高性能, 最高性能大于任何待处理任务的数据量)。小明有一次重启系统的权限(也可以不使用),你能帮他算出最多能完成几个任务吗?
输入:
第一行: N (2 <= N <= 1000) 待处理的任务数 第二行: N个整数,每个任务的数据量
输出:
输出只包括一行,这一行只包含一个整数,表示最多能完成的任务数。
样例输入:
10 1 5 4 3 2 10 9 8 7 6
样例输出:
9
题目分析:
其实也不难,可以理解为在一个序列中求两个不增子序列
但是这两个子序列头尾相连
相连的那个数字是x
第一个子序列是0~x中最长不增子序列,第二个则是x+1~n的最长不增子序列
上代码:
#include<bits/stdc++.h> using namespace std; int a[1000]={0},n=0,d[1000]={0},p[1000]={0},ans=0; int b(int a1,int sum){//计算长度 int dp1[1000]={0}; for(int i =0;i<=sum;i++){ dp1[i]=1; } for(int i = a1+1;i<=sum;i++){ if(a[i]<=a[i-1]){ dp1[i]=dp1[i-1]+1; }else{ dp1[i]=dp1[i-1]; } } return dp1[sum]; } int main(){ cin>>n; for(int i = 0;i<n;i++){ cin>>a[i]; } for(int i = 0;i<n;i++){ d[i]=b(0,i);//求0~0,0~1.....的最长不增子序列的长度 p[i]=b(i,n-1);//求0~n-1,1~n-1.....的最长不增子序列的长度
}
for(int i = 0;i<n;i++){
ans = max(ans,d[i]+p[i+1]);//比较那两个序列长度加起来大
}
cout<<ans;//输出
return 0;
}
over~

浙公网安备 33010602011771号