| 发表于:2007-10-19 19:19:483楼 得分:20 |
acmer? 最讨厌动态规划,脑子笨,总想不出来子状态,不过这个题偶还是会的,呵呵,代码送给你 #include <stdio.h> #define len 40000 int main() { int m,n,i,j,mid,up,down,max; int a[len],d[len]; while(scanf("%d",&n)==1) //输入一共有几位同学 { for(i=0;i <n;i++) scanf("%d",&a[i]); //用a数组记录这n位同学的身高 d[0]=-1; d[1]=a[0]; max=1; for(i=1;i <n;i++) //查找每个同学是否在最长子序列里 { down=0; up=max; while(down <=up) //用d数组记录最x长子序列的最小身高是多少 { mid=(up+down)/2; if(d[mid] <a[i]) down=mid+1; else up=mid-1; } d[down]=a[i]; if(down> max) max++; //这里采用二分法查找d数组,满足nlogn } printf("%d\n",n-max); //打印最少出列的同学数 } return 0; } | | |
|