两点距离只需要简单相减即可,不需要相减后在加一或减一(因为这个小小细节调了一个半小时)
信息学院的同学小明毕业之后打算创业开餐馆.现在共有 n个地点可供选择。
小明打算从中选择合适的位置开设一些餐馆。
这 n个地点排列在同一条直线上。
我们用一个整数序列 m1,m2,…,mn来表示他们的相对位置。
由于地段关系,开餐馆的利润会有所不同。我们用 pi表示在 mi处开餐馆的利润。
为了避免自己的餐馆的内部竞争,餐馆之间的距离必须大于 k
。
请你帮助小明选择一个总利润最大的方案。
输入格式
输入第一行是整数 T
,表明有 T
组测试数据。紧接着有T组连续的测试。每组测试数据有 3 行。
第1行:地点总数 n
, 距离限制 k
;
第2行: n
个整数,表示 n
个地点的位置 m1,m2,…,mn
(按升序排列);
第3行: n
个整数,表示 n
个地点的餐馆利润 p1,p2,…,pn
。
输出格式
输出共 T
行,每行输出一组测试数据可能的最大利润。
数据范围
1≤T≤1000
,
n<100
,
0<k<1000
,
0<mi<106
,
0<pi<1000
include[HTML_REMOVED]
include[HTML_REMOVED]
using namespace std;
const int N=110;
int m[N],p[N];
int f[N][N],n,k;
int low(int a)
{
int l=0,r=n;
while(l<r)
{
int mid=(l+r+1)/2;
if(m[mid]<a) l=mid;
else r=mid-1;
}
return r;
}
int main()
{
int t;
cin>>t;
m[0]=-1e4;
while(t–)
{
cin>>n>>k;
for(int i=1;i<=n;i) cin>>m[i];
for(int i=1;i<=n;i) cin>>p[i];
memset(f,0,sizeof f);
int res=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
f[i][j]=max(f[i-1][j],f[i][j-1]);
int x=low(m[i]-k+1);
f[i][j]=max(f[x][j-1]+p[i],f[i][j]);
}
}
cout<<f[n][n]<<endl;
}
return 0;
}