【題目描述】
信息學院的同學小明畢業之後打算創業開餐館.現在共有n
個地點可供選擇。小明打算從中選擇合適的位置開設一些餐館。這 n個地點排列在同一條直線上。我們用一個整數序列m1,m2,...mn來表示他們的相對位置。由於地段關係,開餐館的利潤會有所不同。我們用pi 表示在mi處開餐館的利潤。爲了避免自己的餐館的內部競爭,餐館之間的距離必須大於k
。請你幫助小明選擇一個總利潤最大的方案。
【輸入】
輸入第一行是整數 T(1≤T≤1000)
,表明有T組測試數據。緊接着有T組連續的測試。每組測試數據有3
行。
第1行:地點總數n(n<100)
, 距離限制k(k>0且k<1000)
;
第2行:n 個地點的位置m1,m2,...mn(1000000>mi>0
且爲整數,升序排列);
第3行:n 個地點的餐館利潤p1,p2,...pn(1000>pi>0
且爲整數)。
【輸出】
對於每組測試數據可能的最大利潤。
【輸入樣例】
2
3 11
1 2 15
10 2 30
3 16
1 2 15
10 2 30
【輸出樣例】
40
30
狀態方程:dp[i]=max(dp[i],dp[j]+profit[i])//dp[i]表示前i個地點開餐館的最大利潤
// Created on 2020/2/20
/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int idata=1000+5;
const int inf=0x3f3f3f3f;
int n,m,t;
int minn=INT_MAX,maxx=INT_MIN;
ll sumfee[idata];
int maps[idata],profit[idata];
int seat[idata];
int i,v,j,k;
inline void initial()
{
for(i=1;i<=n;i++)
cin>>maps[i];
for(i=1;i<=n;i++)
{
cin>>profit[i];
sumfee[i]=profit[i];
}
maxx=-inf;
return ;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
initial();
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(maps[i]-maps[j]>m)
sumfee[i]=max(sumfee[i],sumfee[j]+profit[i]);
}
}
for(i=1;i<=n;i++)
{
if(maxx<sumfee[i])
maxx=sumfee[i];
}
cout<<maxx<<endl;
}
return 0;
}
// Created on 2020/2/20
/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int idata=1000+5;
const int inf=0x3f3f3f3f;
int n,m,t;
int minn=INT_MAX,maxx=INT_MIN;
ll sumfee[idata];
int maps[idata],profit[idata];
int i,v,j,k;
inline void initial()
{
for(i=1;i<=n;i++)
cin>>maps[i];
for(i=1;i<=n;i++)
{
cin>>profit[i];
}
memset(sumfee,0,sizeof(sumfee));
maxx=-inf;
return ;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
initial();
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(maps[i]-maps[j]>m&&sumfee[j]>sumfee[i])
sumfee[i]=sumfee[j];
}
sumfee[i]+=profit[i];
}
for(i=1;i<=n;i++)
{
if(maxx<sumfee[i])
maxx=sumfee[i];
}
cout<<maxx<<endl;
}
return 0;
}