計算最少出列多少位同學,使得剩下的同學排成合唱隊形
說明:n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk, 則他們的身高滿足存在i(1<=i<=k)使得t1ti+1>......>tk。
你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
輸入描述:
整數n輸出描述:
最少需要幾位同學出列
輸入例子:
8輸出例子:186 186 150 200 160 130 197 200
4思路:第一種想法比較容易想到的是列舉處於中間位置的身高的值mid,然後根據mid所處的位置,對於0-mid-1部分求最大遞增子串行,對mid+1~n求最大遞減子串行。
很明顯的是複雜度為o(n^3),超時;
優化的方法:容易了解到,只要求得第i個位置,從0~i的遞增子串行,以及從i~n-1的遞減子串行即可;so,我們可以求得從0~n-1依次遞增子串行,然後倒著求遞增子串行;分別求出每乙個位置兩者所得的子串行之和的最大值即可獲得answer;
這樣時間複雜度為o(n^2);
**如下:
1 #include2 #include3 #include4using
namespace
std;
5#define maxn 1000067
intdp1[maxn] ,dp2[maxn], h[maxn] , ans;89
void solve(int n , int &ans)19}
20 dp2[n-1] = 1;21
for(int i = n-2 ; i >= 0 ; i --)
27 max1 = max(max1 , dp1[i] +dp2[i]);28}
29 ans =max1 ;30}
3132
intmain()
45return0;
46 }
合唱隊 華為
計算最少出列多少位同學,使得剩下的同學排成合唱隊形 說明 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足存在i 1 i k 使得t1ti 1 ...
華為OJ合唱隊
描述 計算最少出列多少位同學,使得剩下的同學排成合唱隊形 說明 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足存在i 1 i k 使得titi...
華為oj 合唱隊
這個題目可以分解成正序和逆序的最大上公升子串行的問題來處理,對每個數字存放以當前數字為結尾時的最大上公升子串行數,只需要對前面的每個數進行比較,找到比當前數字小的數字,並且上公升子串行長度最大的作為當前的最大值,即for i 1 ia j dp j 1 dp i dp i dp j 1 最後對每個數...