導彈攔截問題 dp c++


 
         
 1 //
 2 // Created by snnnow on 2020/4/13.
 3 //
 4 //每一次攔截只能是降續的導彈
 5 //如果該次不能攔截成功,則攔截次數需要加一
 6 //求每次最大攔截量,以及需要的攔截次數
 7 //
 8 //單次攔截:最長不上升序列--dp
 9 //攔截次數:(官方上叫它為"貪心")就是挨個比較逆序列嘛,要是出現比所有已知逆序列最小值都大的就加次數
10 //如果有多個一樣的就是
11 //
12 #include <iostream>
13 #include <string.h>
14 using namespace std;
15 int main(){
16     int a[10010]={0};//這個是用來存放輸入的數的
17     int b[10010]={0};//b[i]是指a[i]這個前面連着的最長的有幾個
18     int c[10010]={0};//..
19     int i=1;
20     int maxall=0;
21     int allway = 0;//表示一共幾套系統
22    while(cin>>a[i]) {
23        if (a[i] != 0) {
24 //           if (i == 1) {
25 //               i++;
26 //               continue;
27 //           } else {
28                int max = 0;
29                for (int j = 1; j <= i-1; j++) {//注意一下,j是前面的,基准數字i是剛輸進去的才是后面的
30                    if (a[j] >= a[i] && b[j] > max) {//有第二句條件的原因是:如果變化量a[j]有多個滿足條件,就要找最大的一個了,因為b[i]是最長的
31                        max = b[j];
32 
33                    }
34                    b[i] = max + 1;//max負責記錄最大量,最后給了b[i];+1是因為算上b[i]就多了一個嘛
35                    if (b[i] > maxall) {
36                        maxall = b[i];//用來記錄所有的最大值
37                    }
38 
39 
40                    //接下來這一段是判斷哪一套系統的,c[a]就是指第a套系統中的最小值
41 
42                }
43                int basic = 0;
44 
45                for (int k = 1; k <= allway; ++k) {//每一套系統都來試試a[i]行不行(可能一套都不行,也可能一套行或多套行)
46                    if (a[i] <= c[k]) {//需要跟每一套系統的最小值比較
47                        if (basic == 0) {//basic為零說明這是第一個滿足條件的,那就直接歸到第k組就行
48                            basic = k;//還有就是先有的一套才有的多套,所以這個if大家都要進
49 
50                        }
51                        else if (c[k] < c[basic]) {//如果有多種情況滿足條件,那就找c小的,因為C大的可以滿足的情況多
52                            basic = k;
53                        }
54                    }
55 
56                }
57                if (basic == 0) {//basic為0,說明沒有已存在的系統,那就只能開新的了
58                    allway++;
59                    basic = allway;
60                }
61                c[basic] = a[i];//basic 是在為a[i]找個系統,c[basic]是a[i]存在的系統中最小的了(就是a[i])
62                i++;
63            }
64 
65 
66        else break;
67    }
68    cout<< maxall+1<<" "<<allway<<endl;
69    return 0;
70 
71 }
 
         

 

剛剛debug代碼,發現了幾個問題
1.a,b都是從一開始的(沒有影響),但是c是從0開始的
2.不上升允許相等的狀態存在(>=)一開始漏等號,會很涼
3.注意不要重復定義變量..還有就是變量定義的位置也很重要呀!!!(比如一開始把allway放循環里了,很讓人傷心的debug)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM