HDU 1158 Employment Planning

HDU上的这个破题太恶心了。


数据都不给范围。 我想出了做法都不敢写。 想的三层循环真害怕超时。 还有数组越界。。 我也是醉了


只好试试。还对了。。 这个题挺简单的。就是求某一个月份多少人的最小值


d【i】【j】。 注意一个问题。 对于这个月的人数最小值 一定是这个 这个月给定的人数。 最大值可以是以前出现过的人数的最大值。


而 对于第 i月的 状态。 当然是由 i-1 的时候的状态来决定的。 所以。 在求 i月状态的时候 应该从 i-1月的确定人数开始遍历。


考虑到这个问题了就没什么坑了。

再默默的鄙视一下这个题不给数据范围!


#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 10+10
#define INF (1<<30)
#define mod 123456789
int d[15][10000+10] = {0};
int main (){
    int n;
    while(scanf("%d",&n) && n){
        int be,in,af;
        int month[MAXN] = {0};
        scanf("%d%d%d",&be,&in,&af);
        for(int i = 1; i <= n; i++){
            scanf("%d",&month[i]);
        }

        for(int i = 0; i <= 12; i++)
            for(int j = 0; j <= 10000; j++)
                d[i][j] = INF;
        int mi = month[1],ma = month[1];
        d[1][month[1]] = (be+in)*month[1];
        ma = max(ma, month[1]);
        for(int i = 2; i <= n; i++){
            ma = max(ma, month[i]);
            for(int j = month[i]; j <= ma; j++){
                for(int k = month[i-1]; k <= ma; k++){
                    if(j < k)
                        d[i][j] = min(d[i-1][k]+af*(k-j)+j*in, d[i][j]);
                    else
                        d[i][j] = min(d[i-1][k]+(be)*(j-k)+j*in, d[i][j]);
                }
            }

        }
        mi = INF;
        for(int i = month[n]; i <= ma; i++){
            mi = min(mi, d[n][i]);
            //printf("%d\n",d[n][i]);
        }
        printf("%d\n",mi);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值