hdu 1158 Employment Planning

dp[i][j] 表示从 1 ~ i个月有 j 个工人的支出最少。

dp[i][j] = min ( dp[i - 1][k] + cost, dp[i][j] )     // k = month[i - 1] ~ Max; Max 表示最多需要的人数

j > k  cost  = ( j - k ) * hire + j * salary;

j < k  cost  = ( k - j ) * fire + j * salary;

ans = min ( dp[n][i] )     // i = month[n] ~ Max




#include <stdio.h>           
                             
int min ( int a, int b ) {   
    return a < b ? a : b;    
}                            
                             
int Case, month[13], dp[13][100], hire, salary, fire, cost;
                             
int main ( ) {               
    while ( scanf ( "%d", &Case ) && Case ) {
        scanf ( "%d%d%d", &hire, &salary, &fire );
        int Max = 0;         
        for ( int i = 1; i <= Case; ++i ) {
            scanf ( "%d", &month[i] );
            if ( month[i] > Max ) Max = month[i];
        }                    
                             
        for ( int i = month[1]; i <= Max; ++i ) dp[1][i] = i * ( hire + salary );                                                               
                             
        for ( int i = 2; i <= Case; ++i ) {
            for ( int j = month[i]; j <= Max; ++j ) {
                dp[i][j] = 100000000;
                for ( int k = month[i - 1]; k <= Max; ++k ) {
                    if ( j > k ) cost = ( j - k ) * hire + j * salary;
                    else cost = ( k - j ) * fire + j * salary;
                    dp[i][j] = min ( dp[i][j], dp[i - 1][k] + cost );
                }            
            }                
        }                    
                             
        int ans = dp[Case][month[Case]];
        for ( int i = month[Case] + 1; i <= Max; ++i )
            if ( ans > dp[Case][i] ) ans = dp[Case][i];
        printf ( "%d\n", ans );
    }                        
}                     



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值