\(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:\) #include #include #include #include #include #include #include #include #include #include #include