题目大概:

一条路上可以在n个位置建饭店,每个饭店到最左边的距离不同,盈利不同,并且在k距离内只能有一个饭店。

思路:

这个题很像背包问题。

dp[n]是前n个饭店的最大盈利,a[n],位置,b[n]盈利,c[n]n到最左边的距离。

1。。当前位置不建,dp[n]=dp[n-1]。

2。。当前位置建,dp[n]=max(dp[k]   k=1....n-1 )+b[n]。

感想:

大部分动态规划都是选当前的一种情况,不选一种情况。

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[101];
int main()
{int t,n,m,a[101],b[101];
cin>>t;
for(int i=0;i<t;i++)
{cin>>n>>m;

for(int j=1;j<=n;j++)
{cin>>a[j];
}
for(int j=1;j<=n;j++)
{cin>>b[j];dp[j]=b[j];
}

int ma=0,mm=0;
for(int k=1;k<=n;k++)
{for(int j=1;j<k;j++)
{if(a[k]-a[j]>m){if(ma<dp[j])ma=dp[j];}

}

dp[k]=max(dp[k],dp[k]+ma);
if(mm<dp[k])mm=dp[k];
}

cout<<mm<<endl;

} return 0;
}