HDU6024-Building Shops-简单DP

来源:互联网 发布:c语言贪心算法例题 编辑:程序博客网 时间:2024/06/10 18:46
//传送门: http://acm.hdu.edu.cn/showproblem.php?pid=6024#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <math.h>#include <vector>using namespace std;#define LL long long#define N 3005#define M 2005LL INF=0x6f6f6f6f;const double eps = 1e-10;const int mod = 1e9 + 7;/*题意:按教室位置从左到右建糖果屋,如果建糖果屋花销为建设费用,如果不建则花销为 当前教室位置与左侧第一个糖果屋位置之差,此外,第一个教室必须建为糖果屋。dp[j][i] 表示  到第i个 前一个 建了糖果屋的是 jif(j==i) dp[j][i] = min(dp[j][i],dp[j][i-1])+no[i].b;else dp[j][i] = min(dp[j][i],dp[j][i-1]) + no[i].a - no[j].b;*/LL dp[N][N];struct node{    int a,b;    bool friend operator<(node x,node y){       return x.a < y.a;    }}no[N];int main(){   int n;   INF *= INF;   while(~scanf("%d",&n)){     for(int i=1;i<=n;i++){        scanf("%d%d",&no[i].a,&no[i].b);     }     memset(dp,INF,sizeof(dp));     sort(no+1,no+n+1);        dp[1][1] = no[1].b;        dp[2][2] = dp[1][1] + no[2].b;        dp[1][2] = dp[1][1] + no[2].a - no[1].a;        for(int i=3;i<=n;i++){            dp[i][i] = min(dp[i][i],dp[i-1][i-1] + no[i].b);            dp[i-1][i] = min(dp[i-1][i],dp[i-1][i-1] + no[i].a - no[i-1].a);            for(int j=1;j<=i-2;j++){                dp[i][i] = min(dp[i][i],dp[j][i-1]+no[i].b);                dp[j][i] = min(dp[j][i],dp[j][i-1]+no[i].a-no[j].a);            }        }        LL ans = dp[n][n];        for(int i=1;i<=n-1;i++) ans = min(ans,dp[i][n]);        printf("%lld\n",ans);   }}

0 0
原创粉丝点击