问题分析
问在一条直线上的
个位置开餐馆可以获得的最大利润是多少,必须保证每个餐馆的距离大于
。
状态转移方程的话,我觉得和最长上升子序列蛮像的,这里是用
来代表以
位置结尾所获得的最大利润是多少
那么方程就是
#include<bits/stdc++.h>
int dp[101], loc[101], v[101];
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
memset(dp,0,sizeof dp);
memset(loc,0,sizeof loc);
memset(v,0,sizeof v);
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; ++i)
scanf("%d",loc+i);
for(int i = 1; i <= n; ++i)
scanf("%d",v+i);
/*init loc[i] value*/
for(int i = 1; i <= n; ++i)
dp[i] = v[i];
//the max value can be obtain end of j
for(int j = 1; j <= n; ++j){
for(int d = j+1; d <= n; ++d){
if(loc[d]-loc[j]>k){
dp[d] = std::max(dp[d],dp[j]+v[d]);
}
}
}
int ans = 0;
for(int i = 1; i <= n; ++i){
ans = std::max(dp[i],ans);
}
printf("%d\n",ans);
}
return 0;
}