lightoj 1381 - Scientific Experiment dp

来源:互联网 发布:linux shell 等待 编辑:程序博客网 时间:2024/04/30 02:43

点击打开链接

题意:

 一个评估蛋的硬度方法是测量蛋从多高摔下来会碎。现在佳佳想以楼层高度作为考量依据评估蛋的 硬度。如果蛋从i楼上掉下来会碎,而i-1不会,那么蛋的硬度为i。高为n层的实验楼里面有蛋卖,一个X元。佳佳开始没有蛋,并且他只能随身携带一个蛋, 不带蛋进楼需要Y元,带蛋需要Z元,做完试验之后如果还有一个蛋,可以卖掉得X/2元(卖蛋不需要进楼)。佳佳把鸡蛋扔出去后,会出楼检查蛋的情况。如果 蛋扔下后没有碎掉,佳佳一定会把蛋捡起,然后进楼,如蛋碎掉了,佳佳就不会管它。 佳佳想知道在最糟糕的情况下,测出蛋的硬度最少需要花费多少钱。


思路:

注意从最高层楼扔下来鸡蛋是一定会碎的。

设dp[i]为i层楼测鸡蛋硬度的最小花费,考虑在j层扔下一枚鸡蛋,

1.如果摔碎了,那么花费则是dp[j] + x + y; 碎了 就要进楼y+买蛋x

2.如果没摔碎,那么花费则是dp[i-j] + z;    没碎 就要带蛋进楼z

3.如果j = i - 1,则2中的花费应为 y + x - x / 2;  第一次试验了i-1层 在没碎的情况下 就有结果了 进楼y+买蛋x-卖蛋x/2


代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;long long dp[1005],d1,d2;long long ans;int main(){int t; cin>>t;for(int cas=1; cas<=t; cas++){int n,x,y,z;cin >> n >> x >> y >> z;memset(dp,0x3f,sizeof(dp));dp[0] = dp[1] = 0;for(int i=2; i<=n; i++){for(int j=1; j<i; j++){d1 = dp[j]+x+y; // 碎了 就要进楼y+买蛋xd2 = dp[i-j]+z; // 没碎就要带蛋进楼zif(i-j==1)d2 = y+x-x/2; // 第一次试验了i-1层 在没碎的情况下 就有结果了 进楼y+买蛋x-卖蛋x/2dp[i] = min(dp[i],max(d1,d2)); // 在最糟的情况的最小花费}}cout << "Case " << cas << ": " << dp[n] << endl;}}



0 0