題目描述
計算最少出列多少位同學,使得剩下的同學排成合唱隊形
說明:n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk, 則他們的身高滿足存在i(1<=i<=k)使得titi+1>......>tk。
你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
輸入描述:
整數n
輸出描述:
最少需要幾位同學出列
輸入例子:
8186 186 150 200 160 130 197 200
輸出例子:
4
對於每個位置求出左邊最長遞增子串行,右邊最長遞增子串行,求得2者最大值,用總人數減即可
#include#includeusing namespace std;
int main()
} int ans = 0;
for (int i = 0; ians)//l 與rz中多出乙個當前位置故減 1
ans = l[i] + r[i] - 1;
} cout << n - ans << endl;
return 0;
}
最近的寫法
#includeusing namespace std;
int main()
r[n-1]=0;
for (int i = n -2; i >= 0; i--)//只統計小的,不包含本身
}int ans = 0;
l[0]=0;
for (int i = 1; i < n; i++)
if (l[i] + r[i] + 1>ans)
ans = l[i] + r[i] + 1;
} cout << n - ans << endl;
} return 0;
}
華為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 最後對每個數...
華為OJ 合唱隊
解題思路 實際上這是一道簡單動態規劃的題。但是一眼看上去不是很直觀。題目所謂的合唱隊形就是乙個最長上公升子串行的拼接。只要求出從佇列首到位置 i 的最長上公升子串行長度加上從隊尾開始到位置 i 的最長上公升子串行的長度就能求出合唱隊形的總長度。我們還知道總的人數,減一下就能得出要出列的人數了。求最長...