dp专辑 L - Cow Roller Coaster

题意:

要求建长度为L的过山车,预算为B,求最大的快乐指数,


思路:

dp[i][j]表示在i点花费j美金的最大快乐值,

状态方程为:if(dp[a[i].x+a[i].w][j+a[i].c]<dp[a[i].x][j]+a[i].f)
                                dp[a[i].x+a[i].w][j+a[i].c]=dp[a[i].x][j]+a[i].f;





//AC CODE:


#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;

const int N = 10005;

struct Point
{
    int x,w,f,c;
} a[N];

int cmp ( const void *a , const void *b )
{
    return *(int *)a - *(int *)b;
}
int dp[1005][1005];
//dp[i][j]表示在i点花费j美金的最大快乐值

int main()
{
    int l,n,b,i,j;
    while (scanf("%d %d %d",&l,&n,&b)!= EOF)
    {
        for(i=0; i<n; i++)
            scanf("%d %d %d %d",&a[i].x,&a[i].w,&a[i].f,&a[i].c);
        qsort(a,n,sizeof(a[0]),cmp);
        memset(dp,-1,sizeof(dp));
        for(i=0; i<=b; i++)
            dp[0][i]=0;//从0开始
        for(i=0; i<n; i++)
        {
            for(j=0; j<b; j++)
            {
                if(dp[a[i].x][j]==-1||a[i].c+j>b||a[i].x+a[i].w>l)
                    continue;
                if(dp[a[i].x+a[i].w][j+a[i].c]<dp[a[i].x][j]+a[i].f)
                    dp[a[i].x+a[i].w][j+a[i].c]=dp[a[i].x][j]+a[i].f;
            }
        }
        int max=-1;
        for(i=0;i<=b;i++)
            if(max<dp[l][i])
                max=dp[l][i];
        printf("%d\n",max);
    }
    return 0;
}




你可能感兴趣的:(dp专辑 L - Cow Roller Coaster)