题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2529
题目大意:给出一个队列的总人数和各自的身高,问最少剔除多少人才能让这个序列从左到 i 为一直增高, 从i 到 有一直变矮,相邻两个不能相等。
8 186 186 150 200 160 130 197 220
4
AC程序:
#include "iostream" #include "cstring" using namespace std; #define size 110 int main(){ //freopen("in.txt", "r", stdin); int n, a[size], up[size], down[size], i, j, max; while(cin>>n){ memset(up, 0, sizeof(up)); memset(down, 0, sizeof(down)); for(i = 1; i <= n; i++) cin>>a[i]; //up[i]为1到i可以保留的最大人数 up[1] = 1; for(i = 2; i <= n; i++){ up[i] = 1; for(j = 1; j < i; j++){ if(a[j] < a[i] && up[j] + 1 > up[i]){ up[i] = up[j] + 1; } } } //down[i]为i到n可以保留的最大人数 down[n] = 1; for(i = n - 1; i >= 1; i--){ down[i] = 1; for(j = n; j > i; j--){ if(a[j] < a[i] && down[j] + 1 > down[i]){ down[i] = down[j] + 1; } } } max = 0; //求可以保留的最大人数 for(i = 1; i <= n; i++){ if(up[i] + down[i] > max) max = up[i] + down[i]; } max--; //对于i算了两次,所以减1 cout<<n - max<<endl; } return 0; }