• 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;
    }
    


  • 相关阅读:
    iOS 倒计时及获取本时区时间
    文字上的删除线
    ios 预览文件-QLPreviewController用法
    iOS delegate、notification、KVO的区别
    mvc 详解
    app切图暂时没有iOS8的,后续继续添加
    背影图
    字体渐变
    ios for 循环 创建 九宫格
    Spherical Harmonics Lighting
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6978072.html
Copyright © 2020-2023  润新知