(1158)HDU

简单DP,最开始自己没有按照人数来想转移方程,还是要coding

#include<iostream>

#include<cstdio>
#include<algorithm>
#include<string.h>


#define MAX 10009
#define INF 0xfffffff


using namespace std;


/*
dp[i][j] = max(dp[i-1][k]+cost,g[i-1]<=k<=MAXN)


前i个月雇佣j个人所用的价值其中cost为从状态dp[i-1][k]转移到dp[i][j]所需额外花费,
g[i]表示第i个月所需最少的工人数,maxN表示所有月所需最大的工人数


*/

int dp[15][1009];
int g[MAX];
int n;
int h,u,f;
int _max;


void solve_dp()
{
   // cout<<_max<<endl;
    int i,j,_min,temp;
    for(int i = g[1];i<=_max;i++)

        dp[1][i] = (h + u)*i;


    for(int i = 2;i<=n;i++)
    {
        for(int j = g[i];j<=_max;j++)
        {
            temp = INF;
            for(int k = g[i-1];k<=_max;k++)
            {
                if(k>j)
                {
                    temp = min(temp,dp[i-1][k] + (k - j)*f + u*j);
                }
                else
                {
                    temp = min(temp,dp[i-1][k] + (j - k)*h + u*j);
                }
            }
            dp[i][j] = temp;
            //cout<<dp[i][j]<<endl;
        }


    }
    int _Min = INF;
    for(int j = g[n];j<=_max;j++)
    {
        _Min = min(_Min,dp[n][j]);
    }
    cout<<_Min<<endl;
}

int main()
{
    while(~scanf("%d",&n)&&n)
    {
        _max = -INF;
        scanf("%d%d%d",&h,&u,&f);
        for(int i = 1;i<=n;i++)
        {
            scanf("%d",&g[i]);
            _max = max(_max,g[i]);
        }
        solve_dp();
    }
    return 0;
}

你可能感兴趣的:((1158)HDU)