hdu 1158 Employment Planning

来源:互联网 发布:飞利浦呼吸机读卡软件 编辑:程序博客网 时间:2024/04/30 18:54
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int MAX = 500005;int dp[13][MAX] = {0};int main(){    int n, h, s, f, p[20], mw;    while (cin>>n, n) {        cin>>h>>s>>f;        mw = 0;        for (int i = 1; i <= n; i++)        {            cin>>p[i];            if (p[i] > mw)                mw = p[i];        }                for (int i = 1; i <= mw; i++)        {            dp[1][i] = i * (s + h);        }                for (int i = 2; i <= n; i++)        {            for (int j = mw; j >= p[i]; j--)            {                dp[i][j] = 1000000000;                for (int k = mw; k >= p[i-1]; k--)  //(1)                {                    if (k >= j)                        dp[i][j] = min(dp[i][j], dp[i-1][k]+(k-j)*f+j*s);                    else                        dp[i][j] = min(dp[i][j], dp[i-1][k]+j*s+(j-k)*h);                }            }        }                int ans = 1000000000;        for (int i = p[n]; i <= mw; i++)            if (ans > dp[n][i])                ans = dp[n][i];                cout<<ans<<endl;    }}
(1)

刚开始时写成了1mw,就错了。因为上一个月工作的人数必定是大于或等于p[i-1]的,因此就没有必要从1mw循环。而且,上一个月的人数是不可能小于p[i-1]的,因此若是从1mw的循环会错,对应到dp数组中,这个月的花费dp[i-1][j]是不可能从dp[i-1][g](g<p[i-1])转移过来的。


0 0
原创粉丝点击