河床

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
题意:给定一个序列,求满足各元素之差都小于k的最大连续段
题解:设定一个二维数组dp[i][j](i表示第几个元素,j表示元素的差值)

#include<stdio.h>
int dp[30005][101];
int a[30005];
int main()
{
int i,n,test,j,k,x,ma;
scanf("%d",&test);
while(test--)
{
scanf("%d%d",&n,&k);
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<=k;i++) dp[0][k]=1;
ma=1;
for(i=1;i<n;i++)
{
for(j=0;j<=k;j++)
{
x=a[i-1]-a[i]+j;
if(x>=0&&x<=k)
{
dp[i][j]=dp[i-1][x]+1;
}
else dp[i][j]=1;
if(dp[i][j]>ma) ma=dp[i][j];
}
}
printf("%d\n",ma);
}
return 0;
}

posted @ 2013-08-07 11:05  forevermemory  阅读(198)  评论(0编辑  收藏  举报