1. 程式人生 > 其它 >重啟系統(動態規劃)

重啟系統(動態規劃)

 題目描述:
小明幫助管理一個處理資料的計算系統,有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~