http://noi.openjudge.cn/ch0206/6045/
较简单的DP
设f[i]为前面i家餐馆的最大利润,初始化f[i]=p[i], f[0] = 0
转移的话,有不选这家餐馆和选这家餐馆两种选择,然后注意找到一个最近且m[i]-m[j]>k的餐馆就可以break了
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ms(i,j) memset(i, j, sizeof i);
using namespace std;
int m[105], p[105], f[105];
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n,k;
scanf("%d%d", &n, &k);
for (int i=1;i<=n;i++) scanf("%d", &m[i]);
for (int i=1;i<=n;i++) {scanf("%d", &p[i]); f[i] = p[i];}
f[0] = 0; m[0] = -100000000;
for(int i=1;i<=n;i++)
for(int j=i-1;j>=0;j--)
{
if (m[i]-m[j]>k)
{
f[i] = max(f[i-1], f[j]+p[i]);break;
}
}
printf("%d\n", f[n]);
}
return 0;
}