【Usaco】2006 Dec

来源:互联网 发布:泰国地图导航软件 编辑:程序博客网 时间:2024/06/05 00:15

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

n种材料建一条长为L的路,
每种材料的起始地点st,长度len,耐久度fun,花费cost
预算为B,建好一条路的最大耐久度是多少

dp[i][j] 表示 距离为i,花费j时的最大耐久度

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn=10005;const int maxl=1005;const int maxc=1005;int L,n,B;int dp[maxl][maxc];struct Node{    int st,len,fun,cost;}a[maxn];bool cmp(struct Node a,struct Node b){    if (a.st==b.st){        return a.len<b.len;    }    return a.st<b.st; }int main(){    cin >> L >> n >> B;    for (int i=0;i<n;i++){        cin >> a[i].st >> a[i].len >> a[i].fun >> a[i].cost;    }    sort(a,a+n,cmp);    memset(dp,-1,sizeof(dp));    dp[0][0]=0;    for (int i=0;i<n;i++){        for (int j=a[i].cost;j<=B;j++){            if (dp[a[i].st][j-a[i].cost]!=-1)            dp[a[i].st+a[i].len][j]=max(dp[a[i].st+a[i].len][j],dp[a[i].st][j-a[i].cost]+a[i].fun);        }    }    int ans=-1;    for (int i=0;i<=B;i++){        ans=max(ans,dp[L][i]);    }    cout << ans << endl;}
原创粉丝点击