who is in front of me 解题报告
2014-04-05 08:35
411 查看
题目描述:N(1<=N<=50005)个学生站成一个纵队,每个人只能看到前面身高比他高(严格大于)的人
求所有人中能看到的最大人数
分析:对于某个人A,设前面第一个身高比他高的人是B。如果B不存在,那么A看到0个人。若B存在,那么A既能看到B,也能看到B所能看到的人(PS:题意是每个人只能看到身高严格大于自己的人,身高与自己相同的人视为看不见)。
状态表示:F(x)表示x能看到的人数
转移方程:F(A)=F(B)+1
怎么才能很快找到A前面第一个比他高的人是谁?对于每个人x,记录他前面第一个比他高的人legt[x]。对于每个人A,我们比较A和A-1的高矮,如果A-1比A高,那么A-1自然是第一个比他高的人。否则我们寻找第一个比A-1高的人,也就是left[A-1],因为在A-1与left[A-1]之间的所有人,身高都比A-1矮,他们也自然不可能比A高。比较A与left[A-1]的高矮,如果不行再找left[left[A-1]]...,直到找到比A高的人,或者发现没有一个人比A高。然后可以用dp求解了。
计算left的代码如下,h为每个人的高度:
for(int i=0;i<N;i++){
int j;
for(j=i-1;j>=0&&h[j]<=h[i];j=left[j]) ;
left[i]=j;
}
求所有人中能看到的最大人数
分析:对于某个人A,设前面第一个身高比他高的人是B。如果B不存在,那么A看到0个人。若B存在,那么A既能看到B,也能看到B所能看到的人(PS:题意是每个人只能看到身高严格大于自己的人,身高与自己相同的人视为看不见)。
状态表示:F(x)表示x能看到的人数
转移方程:F(A)=F(B)+1
怎么才能很快找到A前面第一个比他高的人是谁?对于每个人x,记录他前面第一个比他高的人legt[x]。对于每个人A,我们比较A和A-1的高矮,如果A-1比A高,那么A-1自然是第一个比他高的人。否则我们寻找第一个比A-1高的人,也就是left[A-1],因为在A-1与left[A-1]之间的所有人,身高都比A-1矮,他们也自然不可能比A高。比较A与left[A-1]的高矮,如果不行再找left[left[A-1]]...,直到找到比A高的人,或者发现没有一个人比A高。然后可以用dp求解了。
计算left的代码如下,h为每个人的高度:
for(int i=0;i<N;i++){
int j;
for(j=i-1;j>=0&&h[j]<=h[i];j=left[j]) ;
left[i]=j;
}
#include<cstdio> int T,n,h[50005],num[50005],left[50005]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&h[i]); int best=0; for(int i=0; i<n; i++) { int j; for(j=i-1; j>=0&&h[j]<=h[i]; j=left[j]) ; left[i]=j; if(j==-1) num[i]=0; else num[i]=num[j]+1; best= best>num[i] ? best : num[i]; } printf("%d\n",best); } return 0; }
相关文章推荐
- hrbeu 哈工程 Who Is In Front of Me
- HEU_ Who Is In Front of Me
- 2013资格赛——Who Is In Front of Me
- Who Is In Front of Me(hrbeu1216)
- Who is the Smartest Man 解题报告
- POJ - 2388 Who's in the Middle解题报告
- Pku acm 2388 Who's in the Middle 排序算法解题报告(二)----计数排序
- 【原】 POJ 2388 Who's in the Middle 中位数 解题报告
- [Leetcode] 562. Longest Line of Consecutive One in Matrix 解题报告
- Who is in me? -- Freeware on Windows
- 解题报告Who's in the Middle
- LeetCode 421 Maximum XOR of Two Numbers in an Array 解题报告
- ReactJs 报错 Element type is invalid: expected a string (from built-in components) or a class/function (for composite components) but got: undefined. Check the render method of `Me`.
- 【LeetCode】Number of Segments in a String 解题报告
- 快速排序浅谈——(解题报告)HDU1157和POJ2388---Who's in the Middle
- Uva 11174 Stand in a Line 解题报告(递推+逆元)
- The hierarchy of the type is inconsistent
- Excel With ADO.NET:Cannot modify the design of table ‘xxx′. It is in a read-only database
- [leetcode]215. Kth Largest Element in an Array@Java解题报告
- [Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated colum