TYVJ 1067 合唱队形 解题报告
是某某年的NOIP原题吧,题目的思路如下:
f[i]是1~i的最长上升序列,g[i]代表从后到前的最长上升序列,然后枚举每个i,求n-max{f[i] + g[i] - 1},就是答案。
================================华丽的分割线 ================================
#include <stdio.h>
#include <stdlib.h>
int f1[100], f2[100], num[100];
int ans;
int main(int argc, char **argv)
{
int n;
int i, j;
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &num[i]);
}
for(i = 0; i < n; i++){
f1[i] = 1;
for(j = 0; j < i; j++){
if(num[j] < num[i] && f1[i] < f1[j] + 1){
f1[i] = f1[j] + 1;
}
}
}
for(i = n - 1; i >= 0; i--){
f2[i] = 1;
for(j = n - 1; j > i; j--){
if(num[j] < num[i] && f2[i] < f2[j] + 1){
f2[i] = f2[j] + 1;
}
}
}
for(i = 0; i < n; i++){
if(ans < f1[i] + f2[i] - 1){
ans = f1[i] + f2[i] - 1;
}
}
//题目要求输出的是需要出列的人
printf("%d\n", n - ans);
return 0;
}
浙公网安备 33010602011771号