牛客網 合唱隊形(dp,順逆算兩遍)

2021-10-08 10:17:16 字數 1855 閱讀 6060

合唱隊形

題目描述

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 第三種是,當前列舉到的男生,左邊連續女生的個數 右邊連...