{题解}[jzoj3413]【NOIP2013模拟】KC的瓷器

jzoj3413


Description

KC来到了一个盛产瓷器的国度。他来到了一位商人的店铺。在这个店铺中,KC看到了一个有n(1<=n<=100)排的柜子,每排都有一些瓷器,每排不超过100个。那些精美的艺术品使KC一下心动了,决定从N排的商品中买下m(1<=m<=10000)个瓷器。

这个商人看KC的脸上长满了痘子,就像苔藓一样,跟精美的瓷器相比相差太多,认为这么精致的艺术品被这样的人买走艺术价值会大打折扣。商人感到不爽,于是规定每次取商品只能取其中一排的最左边或者最右边那个,想为难KC。

现在KC又获知每个瓷器的价值(用一个不超过100的正整数表示),他希望取出的m个商品的总价值最大。


100%做法
其实这道题的题解只有两个字:动态规划
首先,设f[i,j]为在前i排中,共取j个的最大价值
是不是还是一脸懵逼?
显然,直接求f[i,j]会很吃力,所以我们需要其他的数组
设take[i,j]为第i排中,取j个的最大价值
设a[i,j]为第i排中,取前j个的价值和
再假设k为在该排中,在最左边选的个数,则在右边选了j-k个
可得take[i,j]=max(a[i,k]+(a[i,S[i]]-a[i,S[i]-j+k]))
于是乎,f的方程就简单了许多
f[i,j]=max(f[i-1,j-k]+take[i,k])
(取k个)
Code
初始化
主程序
AC
其实跑得有些慢,希望大家想出更优的方法!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值