题目链接:点击打开链接
【链接为NEERC 2007整套题,该题为其中的F题】
【要不是UVALive4048题目挂了我也不会出此下策Orz】
初步思路是,设dp[i][j]为当前dp到第i天,股票持有状态为j的情况下的最大获得金额。
那么显然枚举前一天的所有交易决策然后取最大就行了。
关键问题在于状态j如何表示。
首先,最多有8种股票,每种最多可以有8手,所以最先考虑的是用一个8位的9进制数表示状态,不过数字太大数组开不了。
由于股票数总和最多为8,故8位9进制数的所有情况中很多种情况都是不可能出现的。(事实上只有最多12870种情况)
可以想到用map数组来表示dp数组,但这样即使是log级别的查询也会导致TLE。
最后想到的是预处理出0~12869对所有可能出现的状态的映射,这样每次查询就可以做到O(1)。
于是就有了代码中那一段dfs预处理
之后就直接从头到尾DP了,由于要输出最优解的方案所以需要记录路径。
由于避免对不必要计算的状态进行计算,故代码中使用的不是直接DP,而是bfs的方式从最开始的状态展开搜索覆盖最优解。
代码如下,虽然一直改来改去导致其可读性变得非常差。。
将就着看吧Orz
#include<bits/stdc++.h>
#define eps 1e-8
using namespace std;
map<long