最長遞增子串行問題

2021-09-26 02:06:42 字數 2456 閱讀 3439

目錄

最長遞增子串行問題

合唱隊問題應用:

最長公共子串

lcs: :

問題:給定乙個長度為n的陣列,找出乙個最長的單調自增子序列(不一定連續,但是順序不能亂)。例如:給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.

dp法:

設長度為n的陣列為

for(int i = 1;i= 0; --j)

int max_len = 1;

for (int i = 1; in位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。 

合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk,   則他們的身高滿足存在i(1<=i<=k)使得t1ti+1>......>tk。 

你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。 

首先計算每個數在最大遞增子串中的位置

186  186  150  200  160  130  197  200   quene

1      1      1      2       2      1      3     4       遞增計數

然後計算每個數在反向最大遞減子串中的位置--->計算反向後每個數在最大遞增子串中的位置

200  197  130  160  200  150  186  186   反向quene

1      1      1       2     3      2      3       3      遞減計數

然後將每個數的遞增計數和遞減計數相加

186  186  150  200  160  130  197  200   quene

1      1      1      2       2     1      3      4       遞增計數

3      3      2      3       2     1      1      1       遞減計數

4      4      3      5       4     2      4      5       每個數在所在佇列的人數+1(自己在遞增和遞減中被重複計算)

如160這個數

在遞增佇列中有2個人數

150  160

在遞減佇列中有2個人數

160  130

那麼160所在佇列中就有3個人

150  160  130

每個數的所在佇列人數表達就是這個意思

總人數 - 該數所在佇列人數 = 需要出隊的人數

#include#include#includeusing namespace std;

void incre_cnt(vector&arr, vector&cnt)

incre_cnt(num, inc_cnt);

reverse(num.begin(), num.end());

incre_cnt(num, dec_cnt);

reverse(dec_cnt.begin(), dec_cnt.end());

int max_queue = 0;

for (int i = 0; i < n; ++i)

}cout << n - max_queue + 1 << endl;

}return 0;

}

//最長公共子串

}

參考:

最長遞增子串行問題

給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.include define maxn 100 假設最多有100個元素 using namespace std int l maxn l i 表示元...

最長遞增子串行問題

給定正整數序列x1,xn。1 計算其最長遞增子串行的長度s。2 計算從給定的序列中最多可取出多少個長度為s的遞增子串行。3 如果允許在取出的序列中多次使用x1和 xn,則從給定序列中最多可取出多少個長度為s的遞增子串行。設計有效演算法完成 1 2 3 提出的計算任務。由檔案input.txt提供輸入...

最長遞增子串行問題

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入資料為飛彈依次飛來的高度,所...