目錄
最長遞增子串行問題
合唱隊問題應用:
最長公共子串
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提供輸入...
最長遞增子串行問題
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入資料為飛彈依次飛來的高度,所...