hdu1036Gangsters-dp

来源:互联网 发布:动漫人物的发型知乎 编辑:程序博客网 时间:2024/05/19 13:18

pku1036Gangsters


dp[i]=max{ dp[ j ] } + p[ i ]         ,  t[ i ] - t[ j ] >= abs(s[ i ] - s[ j ] )



#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int dp[101];struct X{int t,p,s;}x[101];bool cmp(X a,X b){if(a.t!=b.t)return a.t<b.t;elsereturn a.s<b.s;}int main(){int N,K,T,i,j,max;while(scanf("%d%d%d",&N,&K,&T)!=EOF){max=0;memset(dp,0,sizeof(dp));for(i=1;i<=N;i++)scanf("%d",&x[i].t);for(i=1;i<=N;i++)scanf("%d",&x[i].p);for(i=1;i<=N;i++)scanf("%d",&x[i].s);sort(x+1,x+1+N,cmp);x[0].t=0,x[0].p=0,x[0].s=0;for(i=1;i<=N;i++)for(j=0;j<i;j++)if(dp[i]<dp[j]+x[i].p&&x[i].t-x[j].t>=abs(x[i].s-x[j].s)){if(x[j].t<x[j].s) continue;dp[i]=dp[j]+x[i].p;if(max<dp[i])max=dp[i];}printf("%d\n",max);}return 0;}

之前错误的代码

#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int dp[30001];struct X{int t,p,s;}x[101];bool cmp(X a,X b){if(a.t!=b.t)return a.t<b.t;elsereturn a.s<b.s;}int main(){int N,K,T,i,j,k,max;while(scanf("%d%d%d",&N,&K,&T)!=EOF){max=0;memset(dp,0,sizeof(dp[0])*(T+1));memset(x,0,sizeof(x[0])*(N+1));for(i=1;i<=N;i++)scanf("%d",&x[i].t);for(i=1;i<=N;i++)scanf("%d",&x[i].p);for(i=1;i<=N;i++)scanf("%d",&x[i].s);sort(x+1,x+1+N,cmp);x[0].t=0,x[0].p=0,x[0].s=0;for(i=N;i>1;i--){if(x[i-1].t==x[i].t&&x[i-1].s==x[i].s){x[i-1].p+=x[i].p;x[i].p=0;}}for(i=1;i<=N;i++)for(j=0;j<i;j++)if(dp[x[i].t]<dp[x[j].t]+x[i].p&&x[i].t-x[j].t>=abs(x[i].s-x[j].s)){if(x[j].t<x[j].s) continue;dp[x[i].t]=dp[x[j].t]+x[i].p;if(max<dp[x[i].t])max=dp[x[i].t];}printf("%d\n",max);}return 0;}/*5 10 208 10 16 16 1615 10 11 1 201 10 7 8 74 10 2010 16 8 1610 11 15 110 7 1 8*/
差别在48~53行和预处理