CodeForces1154F
$ZS$大佬说这是一道$SBDP$题.然鹅我懵逼了半天才懵逼过来怎么做(还是在$solution$和$ZS$大佬的指导下才明白…)
数据范围疯狂暗示你$O(k^2)DP$,事实上稍微一想状态就出来了,$f[i]$表示买$k$双鞋的最少花费.
然后这个方程需要$O(n^2)$的转移,但是,由于限制了要买严格$k$双鞋,所以就只需要枚举到$k$即可 .
而$k\le 2000$,所以这就随便过了.
就每次考虑一下从哪里转移过来,显然$f[i]$可以从$f[0],f[1],f[2]…f[i-1]$转移过来.每次只需要考虑有没有对应的套餐去用.
比较一下就好了,这里可以采用一个辅助数组帮助实现转移:令$g[i]$表示买$i$双鞋最多可以免费多少双.这样就比较显然了.
当然,中间由于需要区间和(每次考虑套餐都可能涉及一段区间的和),所以需要前缀和预处理一下.
由此,得到方程是:
$$f[i]=\min_{j=0}^i{f[j]+s[i]-s[j+g[i-j]]}$$
$Code:$
1 |
|