河床

Problem Description

地理学家们经常要对一段河流进行测量分析。他们从上游开始向下游方向等距离地选择了n(<=30000)个点测量水位深度。得到了一组数据d1,d2,…dn,回到实验室后数据分析员需要对数据进行分析,发掘隐藏在数据背后的规律。最近,乌龙博士发现某种水文现象与河床地势有关,于是他指示分析员要找出一段河流中最大高低起伏差不超过k(<=100)的最长一段。这看似一个复杂的问题,由于任务紧急,分析员来求助于你,并告诉你博士所有数据都精确到个位。

Input

输入的第1行为整数t,表示有t组数据,每组数据有2行,第1行是两个整数n和k,分别表示测量点的个数和博士要求的最大水深差。第2行有n个整数,表示从上游开始依次得到的水位深度di(1<=i<=n, 0<=di<=32767)。

Output

对于每组数据输出整数m,表示最长一段起伏不超过k的河流长度,用测量点个数表示。

Sample Input

1
6 2
5 3 2 2 4 5

Sample Output

4
 1 #include <stdio.h>
 2 
 3 int ans,n,k,t;
 4 int d[30005];
 5 int dp[30005][101];
 6 
 7 int main() {
 8     scanf("%d",&t);
 9     while(t--) {
10         scanf("%d%d", &n, &k);
11         for (int i=0; i<n; ++i) scanf("%d", &d[i]);
12         for (int i=0; i<=k; ++i) dp[0][i]=1;
13         ans=1;
14         for (int i=1; i<n; ++i)
15             for (int j=0; j<=k; ++j) {
16                 int down=d[i-1]-d[i];
17                 down=j+down;  //下降距离不操过k
18                 if (down>=0 && down<=k)
19                     dp[i][j]=dp[i-1][down]+1;
20                 else dp[i][j]=1;
21                 if(dp[i][j]>ans) ans=dp[i][j];
22             }
23         printf("%d\n", ans);
24     }
25 
26     return 0;
27 }
View Code

 

posted @ 2013-05-28 23:03  1002liu  阅读(227)  评论(0编辑  收藏  举报