免费做logo设计的网站,建邺做网站价格,做网站平台,wordpress换行命令题目描述 N位同学站成一排#xff0c;音乐老师要请其中的(N−K)位同学出列#xff0c;使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形#xff1a;设K位同学从左到右依次编号为1,2,…,K#xff0c;他们的身高分别为T1,T2,…,TK#xff0c; 则他们的身高…题目描述 N位同学站成一排音乐老师要请其中的(N−K)位同学出列使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形设K位同学从左到右依次编号为1,2,…,K他们的身高分别为T1,T2,…,TK 则他们的身高满足T1... Ti Ti1 … TK(1≤i≤K)。 你的任务是已知所有N位同学的身高计算最少需要几位同学出列可以使得剩下的同学排成合唱队形。 输入输出格式 输入格式 共二行。 第一行是一个整数N(2≤N≤100)表示同学的总数。 第二行有n个整数用空格分隔第i个整数(130≤Ti≤230)是第ii位同学的身高(厘米)。 输出格式 一个整数最少需要几位同学出列。 输入输出样例 输入样例#1 复制 8
186 186 150 200 160 130 197 220输出样例#1 复制 4说明 对于50的数据保证有n≤20 对于全部的数据保证有n≤100。 1 #includecstdio2 #includecstring3 #includecmath4 #includealgorithm5 using namespace std;6 int i,j,n,a[105],f[2][105],ans;7 int main()8 {9 scanf(%d,n);
10 for(i 1;i n;i)
11 {
12 scanf(%d,a[i]);
13 }
14 a[0] 0;
15 for(i 1;i n;i)//从1到n求最长列
16 {
17 for(j 0;j i;j)
18 {
19 if(a[i] a[j])
20 f[0][i] max(f[0][i],f[0][j] 1);
21 }
22 }
23 a[n 1] 0;
24 for(i n;i 1;i--)//从n到1求最长列
25 {
26 for(j n 1;j i;j--)
27 {
28 if(a[i] a[j])
29 f[1][i] max(f[1][i],f[1][j] 1);
30 }
31 }
32 for(i 1;i n;i)
33 {
34 ans max(f[0][i] f[1][i] - 1,ans);//枚举Ti,从1到Ti的最长列从TK到Ti的最长列- 1Ti被加了两次)
35 }
36 printf(%d,n - ans);
37 return 0;
38 } *****显然这个是一个区间DP呦从前往后求最长上升序列然后求从后往前求最长上升序列最后枚举中间人的位置求出答案吼吼吼转载于:https://www.cnblogs.com/rax-/p/9885642.html