HDU 1158 Employment Planning

DP。

槽点满满的题。

1.没有告知人数的范围,导致一开始就想到的dp不敢写。

2.存在人数为0的月份,坑了我好久。

dp[i][j]表示第i个月的工程完工时,有j个人的情况下的最小费用。

#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;

const int INF=0x7FFFFFFF;
int dp[15][1200];
int num[15],n;
int c1,c2,c3;

int main()
{
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=1100;j++) dp[i][j]=INF;
        scanf("%d%d%d",&c1,&c2,&c3);
        int top=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
            top=max(top,num[i]);
        }
        dp[1][num[1]]=(c1+c2)*num[1];
        for(int i=2;i<=n;i++)
        {
            for(int j=num[i];j<=top;j++)
            {
                for(int k=0;k<=top;k++)
                {
                    if(dp[i-1][k]==INF) continue;
                    if(k<j)
                        dp[i][j]=min(dp[i][j],dp[i-1][k]+(j-k)*c1+j*c2);
                    else if(k>=j)
                        dp[i][j]=min(dp[i][j],dp[i-1][k]+(k-j)*c3+j*c2);
                }
            }
        }
        int ans=INF;
        for(int i=0;i<=top;i++)
            ans=min(dp[n][i],ans);
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2016-05-02 13:15  Fighting_Heart  阅读(141)  评论(0编辑  收藏  举报