考研機試真題 合唱隊形 北京大學

2021-08-25 08:22:31 字數 1876 閱讀 6981

關鍵字:動態規劃、最長不下降子串行

題目描述

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 

#include

using

namespace

std;

int main(), dp1[110] = , dp2[110] = ;

for(int i = 0; i < n; ++i)

dp1[0] = 1;

for(int i = 1; i < n; ++i)

}dp1[i] = maxl;

}dp2[n - 1] = 1;

for(int i = n - 2; i >= 0; --i)

}dp2[i] = maxl;

}ans = 1;

for(int i = 0; i < n; ++i)

}cout

<< n - ans << endl;

}}

第2遍寫(9.11)…

#include 

#include

#include

#include

using namespace std;

const int maxn = 110;

int seq[maxn];

int dp1[maxn], dp2[maxn];

int main()

memset(dp1, 0, sizeof(dp1));

dp1[1] = 1;

for(int i = 2; i <= n; ++i)

}dp1[i] = maxv + 1;

}memset(dp2, 0, sizeof(dp2));

dp2[n] = 1;

for(int i = n - 1; i >= 1; --i)

}dp2[i] = maxv + 1;

}maxv = 1;

for(int i = 1; i <= n; ++i)

}printf("%d\n", n - maxv);

}return

0;}

總結:

1.最長不下降子串行:動態規劃解法:

狀態設計:dp[i]表示以i為結尾的最長不下降子串行長度。

狀態轉移:dp[i] = max(dp[j] + 1)(1 <= j < i && seq[i] > seq[j])

邊界處理:dp[1] = 1

2.xcode在執行程式時,沒有加」string.h」標頭檔案的memset函式也能執行…

在oj上提交就不可以了…

3.題目要求的是計算需要幾位同學出列,不要求反求成lis長度。

合唱隊形 北京大學 LIS模板題

正反兩次lis,套了一層殼的lis 感覺這道題目會更加能夠體現lis中的dp陣列的含義 之前的lis題目都要自己去想乙個lis一定是dp陣列裡面最大的那個,因此使用dp陣列 這道題目更加能夠體現lis中dp陣列的涵義!dp陣列的涵義 以i結尾的字串的最長上公升序列 一定要以i結尾 include b...

考研機試真題 吃糖果 北京大學

關鍵字 動態規劃 遞推求解 斐波那契數列 題目描述 名名的媽媽從外地出差回來,帶了一盒好吃又精美的巧克力給名名 盒內共有 n 塊巧克力,20 n 0 媽媽告訴名名每天可以吃一塊或者兩塊巧克力。假設名名每天都吃巧克力,問名名共有多少種不同的吃完巧克力的方案。例如 如果n 1,則名名第1天就吃掉它,共有...

考研機試真題 浮點數加法 北京大學

關鍵字 浮點數加法,可以用字串處理一下,轉換成大整數加法 題目 求2個浮點數相加的和 題目中輸入輸出中出現浮點數都有如下的形式 p1p2 pi.q1q2 qj 對於整數部分,p1p2 pi是乙個非負整數 對於小數部分,qj不等於0 輸入描述 對於每組案例,每組測試資料佔2行,分別是兩個加數。輸出描述...