zoukankan      html  css  js  c++  java
  • hdu 1158 Employment Planning (dp)

    题目大意:

    一个公司知道他每一个月须要多少员工。

    又给出每一个员工的工资。

    每次招聘或者解雇一个人的时候都会给出额外的钱。


    思路分析:

    dp [i][j] 表示第i 个月的时候手上有 j 名员工的最优解。

    状态转移要从上一个月的状态转移过来。

    可是要求到的是最大值。


    dp[i] [j] = min(dp[i][j] , dp[i-1][ a[i-1] --- Max ] + 额外费用+ 工资)...

    这道题目的数据范围不是非常清晰。


    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <set>
    #include <vector>
    #define maxn 1005
    using namespace std;
    
    int a[maxn];
    int hire,sala,fire;
    int dp[20][maxn];
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF && n)
        {
            int m=0;
            scanf("%d%d%d",&hire,&sala,&fire);
            for(int i=1;i<=n;i++)scanf("%d",&a[i]),m=max(m,a[i]);
    
            memset(dp,0x3f,sizeof dp);
            for(int i=0;i<=m;i++)
                dp[1][i]=hire*i+sala*i;
            for(int i=2;i<=n;i++)
            {
                for(int s=a[i];s<=m;s++)
                {
                    for(int j=a[i-1];j<=m;j++)
                    {
                        if(j<s)dp[i][s]=min(dp[i][s],dp[i-1][j]+(s-j)*hire+sala*s);
                        else if(j==s)dp[i][s]=min(dp[i][s],dp[i-1][j]+sala*s);
                        else dp[i][s]=min(dp[i][s],dp[i-1][j]+(j-s)*fire+sala*s);
                    }
                }
            }
            int ans=0x3f3f3f3f;
            for(int i=a[n];i<=m;i++)
                ans=min(ans,dp[n][i]);
            printf("%d
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    eGalax电阻屏的Touch驱动
    Windows 8打开文件夹就假死?找出罪魁祸首!
    VSS之使用详解
    jQuery之六:下拉框学习
    asp.net 之防止sql注入攻击
    javaScript 之 检测浏览器
    转载:泽元系统
    MSMQ之一:基本应用
    javaScript 之 target 和 currentTarget
    jQuery之 弹出对话框
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6978072.html
Copyright © 2011-2022 走看看