给出一个数字序列,表示人的高度,然后问你往前看能看到到最多的人个数是几个,跟自己等高的人看不到,最后求出看到的人最多是几个
明显是动态规划,关键看转移方程是什么,跟求最大递增序列挺像的
起初我想的是,用一个数组保存他们的值,然后i=0 to num{往前回溯过去,直到找到比他大的数}
但是这个算法有个问题,
就是没想到这个算法会tml,原因就是在回溯的时候,往回寻找比他大的数特别费事,好吧,无奈网上搜了个代码,看了看感觉启发不小
用一个数组来记录第一个比当前数大的数的序列,由于i<j的话比i小的肯定比j小,所以找比当前数大的第一个数的话就可以用pos数组来加速寻找了
1 #include <iostream>
2 #include <stdlib.h>
3
4 using namespace std;
5
6 int main(int argc, char *argv[])
7 {
8 long data[50001],res[50001],t,n,i,j,max,pos[50001];//pos[i]记录比第i个数大的第一个数序号
9 scanf("%ld",&t);
10 while(t--){
11 scanf("%ld",&n);
12 memset(res,0,sizeof(res));
13 memset(pos,0,sizeof(pos));
14 max=0;
15 for(i=1;i<=n;i++){
16 scanf("%ld",&data[i]);
17 for(j=i-1;j>=1;j=pos[j]){
18 if(data[i]<data[j]) break;
19 }
20 pos[i]=j;
21 //cout<<"pos["<<i<<"] = "<<pos[i]<<endl;
22 if(pos[i]==0) res[i]=0;
23 else res[i]=res[pos[i]]+1;
24 if(res[i]>max) max=res[i];
25 }
26 printf("%d\n",max);
27 }
28
29 return 0;
30 }