基础dp,排序后对每个人dp即可
状态转移方程是dp[n]=max{dp[i]+porperty[n]}(Time[n]-Time[i]>=ABS(S[n]-S[i]))
就是对之前的每一个可能让N进的人,去中间最大值
#include <stdio.h>
#include <stdlib.h>
struct gangster
{
int T;
int P;
int S;
}gangsters[110];
int cmp(const void *a,const void *b)
{
struct gangster A=*(struct gangster *)a,B=*(struct gangster *)b;
return A.T-B.T;
}
inline int ABS(int x)
{
return x>0?x:-x;
}
int main(void)
{
int N,K,T;
int i=0,j=0,max=0;
int dp[110];
gangsters[0].P=0;
gangsters[0].S=0;
gangsters[0].T=0;
while(scanf("%d%d%d",&N,&K,&T)!=EOF)
{
dp[0]=0;
for(i=1;i<=N;++i)
{
scanf("%d",&gangsters[i].T);
dp[i]=-1;
}
for(i=1;i<=N;++i)
{
scanf("%d",&gangsters[i].P);
}
for(i=1;i<=N;++i)
{
scanf("%d",&gangsters[i].S);
}
qsort(gangsters+1,N,sizeof(struct gangster),cmp);
for(i=1;i<=N;++i)
{
for(j=0;j<i;++j)
{
if(dp[j]!=-1&&gangsters[i].T-gangsters[j].T>=ABS(gangsters[i].S-gangsters[j].S)
&&dp[i]<dp[j]+gangsters[i].P)
{
dp[i]=dp[j]+gangsters[i].P;
}
}
}
max=0;
for(i=1;i<=N;++i)
{
if(max<dp[i])
{
max=dp[i];
}
}
printf("%d\n",max);
}
}