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;
else
return 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;
else
return 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 20
8 10 16 16 16
15 10 11 1 20
1 10 7 8 7
4 10 20
10 16 8 16
10 11 15 1
10 7 1 8
*/
差别在48~53行和预处理