http://poj.org/problem?id=1036
先按时间排序,然后dp
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#define N 110
using namespace std;
struct num
{
int time,p,s;
}a[N];
int dp[N][N];
bool cmp(num p1,num p2)
{
return p1.time<p2.time;
}
int main()
{
int n,k,t;
while(scanf("%d %d %d",&n,&k,&t)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].time);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].p);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].s);
}
sort(a+1,a+n+1,cmp);
memset(dp,-1,sizeof(dp));
dp[0][0] = 0;
a[0].time = 0;
a[0].p = 0;
a[0].s = 0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=k;j++)
{
if(dp[i-1][j]==-1)
{
continue;
}
dp[i][j] = max(dp[i][j],dp[i-1][j]);
for(int u=0;u<=k;u++)
{
if(abs(j-u)<=abs(a[i].time-a[i-1].time)&&u==a[i].s)
{
dp[i][u] = max(dp[i][u],dp[i-1][j]+a[i].p);
}else if(abs(j-u)<=abs(a[i].time-a[i-1].time))
{
dp[i][u] = max(dp[i][u],dp[i-1][j]);
}
}
}
}
int ans = 0;
for(int i=0;i<=k;i++)
{
ans = max(dp[n][i],ans);
}
printf("%d\n",ans);
}
return 0;
}