您的位置:首页 > 其它

题目1131:合唱队形

2017-01-24 17:17 260 查看
#include<stdio.h>
int height[100];
int ans1[100]; //表示从左到右的最长递增子序列
int ans2[100]; //表示从左到右的最长递减子序列
int ans[100];
int getMax(int a, int b) {
return a > b ? a : b;
}
//正反两次使用LIS
int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &height[i]);
ans1[i] = 1;
ans2[i] = 1;
ans[i] = 1;
}
for (int i = 0; i < n; i++) {
int max = 1;
for (int j = 0; j < i; j++) {
if (height[j] < height[i])
max = getMax(max, ans1[j] + 1);
}
ans1[i] = max;
}
for (int i = n - 1; i >= 0; i--) {
int max = 1;
for (int j = n - 1; j > i; j--) {
if (height[j] < height[i])
max = getMax(max, ans2[j] + 1);
}
ans2[i] = max;
}
for (int i = 0; i < n; i++) {
ans[i] = n - ans1[i] - ans2[i] + 1;
}
int min = 0x7fffffff;
for (int i = 0; i < n; i++) {
if (ans[i] < min)
min = ans[i];
}
printf("%d\n", min);
}
return 0;
}

题目链接:
http://ac.jobdu.com/problem.php?pid=1131
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: