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; }