POJ 1036 Gangsters

来源:互联网 发布:幸亏没生在古代 知乎 编辑:程序博客网 时间:2024/05/18 12:39

http://poj.org/problem?id=1036

先按时间排序,然后dp

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cstdlib>#include <cmath>#define N 110using 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;}


0 0
原创粉丝点击