Poj 1036 题解

来源:互联网 发布:淘宝网妈妈冬装 编辑:程序博客网 时间:2024/05/01 03:46

一道dp题。

一开始看起来蒙了,但是其实很简单。

他的门是可以不动的。

也就是说你这个小偷到上一个小偷的这段时间如果大于两者fat的差的绝对值就必定满足。

之后就是dp了

你每一个小偷都继承这上一个来枚举即可,f[i]表示第i个小偷能偷到的荣誉。

其实就是继承的时候判断一下继承的上一个是否合法即可

Code:

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>using namespace std;struct node{  int ti,val,fat;}hum[110];int n,big,ti;bool Cmp(node x,node y){return x.ti<y.ti;}void Input(){  scanf("%d%d%d",&n,&big,&ti);  for(int i=1;i<=n;i++)    scanf("%d",&hum[i].ti);  for(int i=1;i<=n;i++)    scanf("%d",&hum[i].val);  for(int i=1;i<=n;i++)    scanf("%d",&hum[i].fat);  sort(hum+1,hum+n+1,Cmp);}int f[110];int maxx=0;void Solve(){  for(int i=1;i<=n;i++)  {    f[i]=-1;if(hum[i].ti<hum[i].fat) continue;if(hum[i].fat>big) continue;f[i]=0;    for(int j=1;j<i;j++)  if(((hum[i].ti-hum[j].ti)>=abs(hum[j].fat-hum[i].fat)))    f[i]=max(f[i],f[j]);    if(f[i]>=0) f[i]+=hum[i].val;maxx=max(maxx,f[i]);  }}void Output(){  printf("%d\n",maxx);}int main(){  //freopen("a.in","r",stdin);  //freopen("a.out","w",stdout);  Input();  Solve();  Output();  return 0;}


0 0