合唱隊形
題目描述
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
思路
順找最長上公升子串行,反著找一遍最長上公升子串行,答案為k-ans+1(因為同乙個人在兩個子串行中重複)
如下標紅的為最長上公升子串行
186
186150
200160
130197
220186\space186 \space150} \space 200\space160}\space 130 \color\space 197 \space 220
186186
1502
0016
0130
1972
20dpbe[i]表示順序中i所在的最長子序列長度,例子中dpbe陣列為:
1,1,1,2,2,1,3,4
dpaf[i]表示逆序中i所在的最長子序列長度,例子中dpaf陣列為:
3,3,2,3,2,1,1,1
如果:
使用複雜度o(n
2)
o(n^2)
o(n2
)的演算法,遍歷陣列時,對於第i個數,遍歷前面的所有數字,使得
d p[
i]=m
ax(d
p[j]
+1,d
p[i]
)dp[i]=max(dp[j]+1,dp[i])
dp[i]=
max(
dp[j
]+1,
dp[i
])**
#include
#define maxn 1005
using namespace std;
int k;
int arr[maxn]
;int dpbe[maxn]
;int dpaf[maxn]
;int ans;
void init (
)int
main()
dpbe[0]
=1;for
(int i=
1;iif(
!flag)
} dpaf[k-1]
=1;for
(int i=k-
2;i>-1
;i--)}
if(!flag)
ans=
max(dpaf[i]
+dpbe[i]
,ans);}
printf
("%d\n"
,k==1?
1:k-ans+1)
;}return0;
}
牛客網 合唱隊形(思維)
題目 合唱隊形 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 鐵子的班級在畢業晚會有乙個合唱節目,到了畢業晚會的時候,他們必須排成一排一起合唱 認錯 當然是選擇原諒他 等一系列原諒歌曲,但是當隊形布置...
牛客小白月賽4 I 合唱隊形
做法,2個人交換位置肯定是男和女交換,列舉全部男生就可以了。一共就三種情況,第一種是n個人全部是女生,那最長連續女生就是n了,第二種是,當前列舉到的男生,左邊連續女生的個數 右邊連續女生的個數等於總的女生數量,連續長度就是l i 1 r i 1 第三種是,當前列舉到的男生,左邊連續女生的個數 右邊連...
牛客小白月賽4 I 合唱隊形
做法,2個人交換位置肯定是男和女交換,列舉全部男生就可以了。一共就三種情況,第一種是n個人全部是女生,那最長連續女生就是n了,第二種是,當前列舉到的男生,左邊連續女生的個數 右邊連續女生的個數等於總的女生數量,連續長度就是l i 1 r i 1 第三種是,當前列舉到的男生,左邊連續女生的個數 右邊連...