單調遞增子序列-合唱隊列
阿新 • • 發佈:2019-02-14
題目描述
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位同學的身高(釐米)。
輸出描述:
可能包括多組測試資料,對於每組資料, 輸出包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。示例1
輸入
8 186 186 150 200 160 130 197 220
輸出
4
#include "iostream" #include "limits.h" using namespace std; //先求最長遞增子序列 /* 8 186 186 150 200 160 130 197 220 */ int main() { int n = 0; while(cin>>n) { int a[101] = {0}; int l[101] = {0}; int m[101] = {0}; for(int i = 0;i<n;i++) { cin>>a[i]; l[i] = 1; m[i] = 1; } for(int i = 0;i<n;i++) { cin>>a[i]; int sum = INT_MIN; for(int j = 0;j<i;j++) { if(a[i]>a[j]&&sum<l[j]) { sum = l[j]; l[i] = l[j] + 1; } } } for(int i = n-1;i>=0;i--) { int sum = INT_MIN; for(int j = n-1;j>i;j--) { if(a[i] > a[j] && sum < m[j]) { sum = m[j]; m[i] = m[j] + 1; } } } int s = INT_MIN; for(int i = 0;i<n;i++) { if(s<(l[i] + m[i] - 1) ) { s = l[i] + m[i] - 1; } } cout<<n-s<<endl; } return 0; }