周中日记,写几个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个灯泡的最优解了。
解析:
用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]。