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