合唱隊形
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學排成合唱隊形。合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號爲1, 2, …, K,他們的身高分別爲T1, T2, …, TK,則他們的身高滿足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1≤i≤K)。
你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
Input
輸入的第一行爲T,表示測試數據的組數。對於每組測試數據的第一行是一個整數N(2 ≤ N ≤ 100),表示同學的總數。第二行有n個整數,用空格分隔,第i個整數Ti(130 ≤ Ti ≤ 230)是第i位同學的身高(釐米)。
Output
對於每組測試數據,輸出一行只包含一個整數,就是最少需要幾位同學出列。
Sample Input
1 8 186 186 150 200 160 130 197 220
Sample Output
4
思路分析:本題爲兩個DP的組合及從前面求最長上升子序列和從後面求最長上升子序列然後把所有位置相加取最大的。
代碼:#include<stdio.h> #include<string.h> int a[150],b[150],c[150]; int main() { int n,t,max1,i,j,max2; scanf("%d",&t); while(t--) { memset(c,0,sizeof(c)); memset(b,0,sizeof(b)); scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) for(j=0;j<i;j++) if(a[i]>a[j]&&b[i]<b[j]+1) b[i]=b[j]+1; for(i=n-1;i>=0;i--) for(j=n-1;j>i;j--) if(a[i]>a[j]&&c[i]<c[j]+1) c[i]=c[j]+1; max1=0,max2=0; for(i=0;i<n;i++) { // printf("%d",c[i]); max1=b[i]+c[i]; if(max1>max2) max2=max1; } printf("%d\n",n-max2-1); } return 0; }