2018/5/31训练日记

周中日记,写几个dp题的题解吧

有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的,
所有比它重量轻的都是苦的,比它重的都是酸的。

为了要找出甜的苹果,就要去一个一个地吃它,且吃了咬了苹果就必须把它吃完,不管苹果是苦的还是酸的。
我们可以选择一个最佳策略,为了找到甜苹果吃总重量最少。
假设n=4, k=0,那么4个苹果的重量为1,2,3,4,假设先吃 #2个苹果,
如果#1是甜的,那么吃了2时就是酸的,那么就可以确定1是甜的了,共吃重量=2
如果#2是甜的,那么吃的重量=2
如果#3是甜的,那么2是酸的,可以推测甜的在(3,4)中的一个,然后吃3, 就可以确定哪个是甜的,共吃重量=2+3=5
如果#4是甜的,那么方案和上面一样,共吃重量=5
其实就类似二分法。

总共重量 = 2+2+5+5 = 14


解析

我们假设dp[i][j]为i-j区间内的最佳方案下的重量

我们可以选择i-j中的一个k吃掉,那么对于i-----k-1,k+1-----j,每个吃的都得加上v[k],

dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]);



有若干个灯,每个灯有四个值

V  该灯泡的电压,可以买电压高的灯泡代替电压低的灯泡。  电压两两不同

K  发电机价格,只有有一台,就可以供应无限多个该电压的灯泡。

C 灯泡价格

L  这个电压的灯泡需要多少只

问买完所有要求的灯泡的最小花费

解析

因为高电压可以代替低电压的灯泡,所以高电压可以后判断要不要买发电机。

所以先按电压排个序,那么就是后面一定可以代替前面的了。

预处理下灯泡数的前缀和 sum数组。

dp[i]=min(dp[i],dp[j]+la[i].k+la[i].c*(sum[i]-sum[j]));

表示买了i发电机,dp[j]表示买好前j个灯泡的最优解,然后加上买发电机的钱,再加上购买剩下的灯泡的钱,就是总的花费了。取个最小值就是购买前i个灯泡的最优解了。


给n个数,两个人轮流取数,可以从左往右或从右往左取任意多个。两个人都希望自己的取得的数的总和尽量大,都采取最优策略,问第一个人能比第二个人取得的数多多少。

解析:

用dp[i][j]代表只剩下a[i..j]的数,先手可以取得的最大值,此时后手取得的最大值为sum[i..j] - dp[i][j]。

那么状态转移方程为:dp[i][j] = max(sum[i..j], sum[i..j] - min(dp[i+1][j], dp[i+2][j]……), sum[i..j] - min(dp[i][j - 1], dp[i, j - 2])。


输出结果为2 * dp[1][n] - sum[1..n]。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值