【题目描述】
信息学院的同学小明毕业之后打算创业开餐馆.现在共有nn个地点可供选择。小明打算从中选择合适的位置开设一些餐馆。这 nn个地点排列在同一条直线上。我们用一个整数序列m1,m2,...mnm1,m2,...mn来表示他们的相对位置。由于地段关系,开餐馆的利润会有所不同。我们用pipi 表示在mimi处开餐馆的利润。为了避免自己的餐馆的内部竞争,餐馆之间的距离必须大于kk。请你帮助小明选择一个总利润最大的方案。
【输入】
输入第一行是整数 T(1≤T≤1000)T(1≤T≤1000),表明有T组测试数据。紧接着有TT组连续的测试。每组测试数据有33行。
第1行:地点总数n(n<100)n(n<100), 距离限制k(k>0且k<1000)k(k>0且k<1000);
第2行:n 个地点的位置m1,m2,...mn(1000000>mi>0m1,m2,...mn(1000000>mi>0 且为整数,升序排列);
第3行:n 个地点的餐馆利润p1,p2,...pn(1000>pi>0p1,p2,...pn(1000>pi>0 且为整数)。
【输出】
对于每组测试数据可能的最大利润。
【输入样例】
2 3 11 1 2 15 10 2 30 3 16 1 2 15 10 2 30
【输出样例】
40 30
#include <stdio.h>
int f[20001],m[1000],p[1000];
int main(){
int t,i,j;
scanf("%d",&t); //测试数据组数t
while(t--){
int n,k,ans=0;
scanf("%d%d",&n,&k); //地点总数n 距离限制k
for(i=0;i<n;i++) scanf("%d",&m[i]); //各地点位置
for(i=0;i<n;i++) scanf("%d",&p[i]); //各地点利润
for(i=0;i<n;i++){ //确定边界结束点
f[i]=p[i]; //每个位置的初始利润
for(j=0;j<i;j++)
if(m[i]-m[j]>k)
f[i]=f[i]>f[j]+p[i]?f[i]:f[j]+p[i]; //每个位置所能得到的最大利润
ans=f[i]>ans?f[i]:ans;
}
printf("%d\n",ans);
}
return 0;
}