• Employment Planning


    Employment Planning

    有n个月,每个月有一个最小需要的工人数量(a_i),雇佣一个工人的费用为(h),开除一个工人的费用为(f),薪水为(s),询问满足这n个月正常工作的最小费用,(nleq 12)

    显然可以猜一个结论,因为工人数不确定,猜测每一个月的工人数量必然为某一个月的工人的最小数量,于是可以设(f[i][j])表示前i个月,拥有工人数量(b_j)的最小费用,其中(b)(a)的离散化数组,因此有

    (f[i][j]=min(min_{k=0}^jf[i-1][k]+(b_j-b_k) imes h,min_{k=j+1}^nf[i-1][k]+(b_k-b_j) imes f)+s imes j)

    这个dp是(O(n^3))的,但是使用单调队列可以优化到(O(n^2)),但数据范围没必要。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define il inline
    #define ri register
    #define Size 50
    using namespace std;
    int a[Size],b[Size],dp[Size][Size];
    int main(){
    	int n,h,s,f;
    	while(scanf("%d",&n),n){
    		scanf("%d%d%d",&h,&s,&f);
    		for(int i(1);i<=n;++i)scanf("%d",&a[i]),b[i]=a[i];
    		sort(b+1,b+n+1),memset(dp,0x3f,sizeof(dp)),dp[0][0]=0;
    		for(int i(1),j,k;i<=n;++i)
    			for(j=0;j<=n;++j)
    				if(b[j]>=a[i]){
    					for(k=0;k<=j;++k)
    						dp[i][j]=min(dp[i][j],dp[i-1][k]+(b[j]-b[k])*h+s*b[j]);
    					for(k=j+1;k<=n;++k)
    						dp[i][j]=min(dp[i][j],dp[i-1][k]+(b[k]-b[j])*f+s*b[j]);
    				}int ans(0x3f3f3f3f);
    		for(int i(0);i<=n;++i)
    			ans=min(ans,dp[n][i]);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    git 强制覆盖本地
    给mysql添加账户并且赋予权限
    laravel 地址栏传参不了问题
    订单系统开发02
    熵——信息增益
    熵——导读
    熵——自信息
    tensorflow在文本处理中的使用——skip-gram & CBOW原理总结
    霍夫曼树
    tensorflow在文本处理中的使用——Word2Vec预测
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11408512.html
Copyright © 2020-2023  润新知