动态规划题。就像那个大富翁游戏里面的接金币一样,问题是,它的时间跨度很大(0 <= T <= 30000 ),肯定不可能用数组记录的,要另想法子。
#include<iostream.h>
#include<stdlib.h>
#include<search.h>
#include <cmath>
int N,K,T;
int max;
struct Gangster{
int s, p, t;
};
Gangster g[100];
int best[100];
int compare(const void *a,const void *b)
{
if( ((Gangster*)a)->t<((Gangster*)b)->t) return -1;
if( ((Gangster*)a)->t>((Gangster*)b)->t) return 1;
return 0;
}
int main()
{
cin>>N>>K>>T;
for(int i=0;i<N;i++)
cin>>g[i].t;
for( i=0;i<N;i++)
cin>>g[i].p;
for( i=0;i<N;i++)
cin>>g[i].s;
qsort(g,N,sizeof(Gangster),compare); //对强盗按到达时间排序
max=0;
for(i=0;i<N;i++)
{
best[i]=-1;
if(g[i].t>=g[i].s) best[i]=0; //若最后一个gangster的位置可移动得到,至少可得财富
for(int j=0;j<i;j++)
{
int dt=g[i].t-g[j].t;
int ds=abs(g[i].s-g[j].s);
if((best[j]>best[i])&&(dt>=ds)) //对前j个人的处理的最佳值,且能拿到第i财富
best[i]=best[j]; //跳过中间j-i之间的盗贼
}
if(best[i]>=0) best[i]+=g[i].p; //取得第i个盗贼的财富
if(best[i]>max ) max=best[i];
}//best[i]表示以第i个盗贼为最后顾客能取得的最大财富
cout<<max;
return 0;
}