UVALive 4048 Fund Management(状压DP)

这篇博客介绍了如何解决UVALive 4048题目——Fund Management,该问题涉及股票交易的动态规划策略。作者提出用一个8位9进制数表示股票持有状态,但由于状态数量巨大,尝试使用map导致超时。最终,通过预处理映射状态并采用广度优先搜索(BFS)避免不必要的计算,实现了O(1)查询的解决方案。代码虽然可读性不高,但展示了问题解决的思路。
摘要由CSDN通过智能技术生成

题目链接:点击打开链接

【链接为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 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值