題目1131:合唱隊形
時間限制:1 秒
記憶體限制:32 兆
特殊判題:否
提交:3549
解決:1104
題目描述:n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。
合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1, 2, …, k,他們的身高分別為t1, t2, …, tk,
則他們的身高滿足t1 < t2 < … < ti , ti > ti+1 > … > tk (1 <= i <= k)。
你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
輸入:輸入的第一行是乙個整數n(2 <= n <= 100),表示同學的總數。
第一行有n個整數,用空格分隔,第i個整數ti(130 <= ti <= 230)是第i位同學的身高(厘公尺)。
輸出:可能包括多組測試資料,對於每組資料,
輸出包括一行,這一行只包含乙個整數,就是最少需要幾位同學出列。
樣例輸入:
8樣例輸出:186 186 150 200 160 130 197 220
4題目的描述也比較清楚,需要找從前往後遞增,並從該結束點開始從前往後遞減。
使用兩個最長不下降序列,乙個表示從前往後不下降,另乙個表示從後往前不下降。
例如對於圖:
我們希望這樣乙個序列的長度是最長的。
很顯然利用最長不下降序列dp可以得到從前往後的最長遞增序列。
dp[i]表示前i個資料最長不下降序列的長度,對於第i個資料,它應當比前面某乙個元素高才能形成以a[i]結尾的最長不下降序列。
於是我們遍歷0~i-1的元素,找到a[j]dp[i]的資料,更新dp[i].
因為前面最長的序列+a[i]的長度已經是這一段最長,所以之後出現的元素不影響這乙個位置最長不下降序列長度的大小;
總體空間複雜度o(n) 時間複雜度o(n^2)
#include#include#include#include#include#include#define n 101
using namespace std;
int main()
} for(int i=n-1;i>=0;i--)
} int maxv=1;
for(int i=0;i
九度OJ 1131 合唱隊形
這是一道最長遞增子串行加強版。只需計算以a i 為結尾的最長遞增子串行,以a i 為開頭的最長遞減子串行 這個實際就是逆序後的以a i 為結尾最長遞增子串行嘛!兩個部分 for i 1 ia j f1 j 1 max f1 i max for i n 2 i 0 i f2 i max 我一開始犯了乙...
九度OJ 題目1131 合唱隊形
題目描述 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti ti ti 1 tk 1 i k 你的任務是,已知所有...
1131 合唱隊形
題目描述 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti ti ti 1 tk 1 i k 你的任務是,已知所有...