UVA 1412 Fund Management (复杂状态的DP,状态池)

最新版电子发票样式html+css--普通发票+增值发票 【代码】最新版电子发票样式html+css--普通发票+增值发票。 阅读详情

UVA 1412 Fund Management (复杂状态的DP,状态池)

受到前面题目的影响,一开始的思路是用d(i,s)表示经过第i天后,选择了集合s里面的股票的当前最大现金。但是发股票可以选多手,根本无法用集合表示。

由于每只股票的可持有的手数为(0<=ki<=8),最多有8只股票,所以表示当前手持股票资产的理论状态数最多有98<5*107种,但是由于还有一个持有总手数k的最大限制,实际状态数将远远低于这个值。实际状态数<1.5e4(我也不知道为什么)

所以用d(i,p)表示经过i天后,当前手持股票资产为p时的最大现金数。因为每只股票可持有的手数为0~8,所以可以用一个9进制的数去表示一个状态p。但是在状态转移的过程中,需要对整数p进行解码、编码的操作十分费时,对于这道题会导致TLE。

借鉴紫书上的做法,先将所有的状态数枚举出来并进行标号储存,这样我们就可以建立起一个状态–自然数的映射。并将每个状态可转移到的状态也通过预处理枚举并储存,这样就大大减少了dp过程的时间。

同时因为股票只能一手一手的买,我们可以将一手的价格预处理出来,这样可以避免重复的运算。

这道理的状态转移过程是十分明了的,可以从题目一眼看是,对于第i天,可以保持(HOLD),可以选择一只股票进行买一手(BUY)或者卖一手(SELL)。

由于是否可以买股票要取决于当前的现金是否足够,所以需要判断。所以这道题并不是DAG上的动态规划,因为edge(u,v)是否存在取决于之前的决策。所以不可以像DAG那样逆着去定义状态:如果用d(i,p)去表示从第i天开始到最后能拥有的最大现金值,那么状态将无法转移,因为不能够判断对于第i-1天,是否有足够的钱去买某个股票的一手。

具体实现上:
用一个vector去表示一个状态,那么可以用一个大vector来作状态池来储存状态,并将每个状态对应的下标作为标号用map建立起映射(ID)。
用buy_next[p][i]来表示在p状态购买了i股票后转移到的状态的编号(合法的),同理用sell_next[p][i]来表示在p状态卖出了i股票后转移到的状态的编号(合法的)。
因为需要打印答案,用pre[i[[p]表示在d(i,p)前一个状态的标号,用opt[i][p]表示在d(i,p)的操作:
当opt[i][p]==0时,表示HOLD操作
当opt[i][p]>0时,表示BUY编号为opt[i][p]-1的股票。
当opt[i][p]<0时,表示SELL编号为-(opt[i][p]+1)的股票。
在打印时只需递归进行打印就好了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int max_state=15000;
const int INF=-0x3f3f3f3f;
double c;
char name[10][30];
int si[10];
int ki[10];
double ci[10][105];
vector<vector<int> > state;
map<vector<int>,int> ID;
int buy_next[max_state][10];
int sell_next[max_state][10];
double dp[105][max_state];
int pre[105][max_state];
int opt[105][max_state];
int n,m,k;
void dfs(vector<int> &lot,int s,int total_k)
{
	if(s==n){
		ID[lot]=state.size();
		state.push_back(lot);
		return ;
	}
	for(int i=0;i<=ki[s]&&total_k+i<=k;i++)
	{
		lot[s]=i;
		dfs(lot,s+1,total_k+i);
	}
}
void init(void)
{
	for(int s=0;s<state.size();s++)
	for(int i=0;i<n;i++)
	{
		int total_k=0;
		for(int j=0;j<state[s].size();j++)
		total_k+=state[s][j];
		buy_next[s][i]=sell_next[s][i]=-1;
		if(state[s][i]>0){
			vector<int> newstate=state[s];
			newstate[i]--;
			sell_next[s][i]=ID[newstate];
		}
		if(state[s][i]<ki[i]&&total_k<k){
			vector<int> newstate=state[s];
			newstate[i]++;
			buy_next[s][i]=ID[newstate];
		}
	}
}
void update(int day,int s,int s2,double v,int option)
{
	if(v>dp[day+1][s2]){
		dp[day+1][s2]=v;
		pre[day+1][s2]=s;
		opt[day+1][s2]=option;
	}
}
void update_ans(int day,int s)
{
	if(day==0)return ;
	update_ans(day-1,pre[day][s]);
	if(opt[day][s]==0)printf("HOLD\n");
	else if(opt[day][s]>0)printf("BUY %s\n",name[opt[day][s]-1]);
	else printf("SELL %s\n",name[-(opt[day][s]+1)]);
}
void solve(void)
{
	state.clear();
	ID.clear();
	vector<int> lot(n);
	dfs(lot,0,0);
	init();
	for(int i=0;i<=m;i++)
	for(int s=0;s<state.size();s++)
	dp[i][s]=INF;
	dp[0][0]=c;
	for(int i=0;i<m;i++)
	for(int s=0;s<state.size();s++)
	{
		double v=dp[i][s];
		if(v<0)continue;
		update(i,s,s,v,0);
		for(int j=0;j<n;j++)
		{
			if(buy_next[s][j]!=-1&&v>=ci[j][i+1])
//			if(buy_next[s][j]!=-1&&v>=ci[j][i+1]-1e-3)
			update(i,s,buy_next[s][j],v-ci[j][i+1],j+1);
			if(sell_next[s][j]!=-1)
			update(i,s,sell_next[s][j],v+ci[j][i+1],-j-1);
		}
	}
	printf("%.2f\n",dp[m][0]);
	update_ans(m,0);
	printf("\n");
}
int main(void)
{
	while(~scanf("%lf%d%d%d",&c,&m,&n,&k))
	{
		for(int i=0;i<n;i++)
		{
			scanf("%s%d%d",name[i],&si[i],&ki[i]);
			for(int j=1;j<=m;j++)
			{
				double temp;
				scanf("%lf",&temp);
				ci[i][j]=temp*(double)si[i];
			}
		}
		solve();
	}
}
Cesium实战:3DTiles模型分层分户抽屉效果实现全攻略(附完整代码) 本文详细解析了在Cesium中为3DTiles模型实现分层分户抽屉效果的核心原理与完整代码。通过“主-副双模型”策略,结合属性过滤与矩阵变换,开发者能够创建出可交互、可探索的动态建筑可视化效果,适用于数字孪生、智慧城市及BIM可视化等场景。 阅读详情

相关推荐

allegro转AD-(附工具)

本文介绍了将Allegro的.brd文件转换为Altium Designer可用的.alg文件的操作流程。首先需要下载专用转换工具,然后通过运行.bat脚本将.brd文件转换为.alg格式。最后在Altium Designer中使用导入向导完成文件转换,生成可用的PCB设计文件。整个过程简单快捷,只需三个步骤即可实现Allegro到Altium Designer的工程文件转换。

weixin_50120208的博客 1717

浅谈微前端

什么是微前端 简单来说就是系统要模块化,通过不同的模块组合构建我们的应用,不同的模块迁移成子应用,最终构建成整个大的应用项目。微前端适合一些巨石应用的项目。 官方一些来说就是 微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。一个完整应用划分成一个主应用和一个或多个微应用,应用间相互独立,可相互通信 微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用。 微前端是一种架构模式,用于构建可扩展的 Web 应用程序,该应用程序随着您的开发团队的发展而增长,

weixin_37989623的博客 620

机器人控制入门:用SAC算法让机械臂学会抓取(PyBullet仿真教程)

本文详细介绍了如何使用SAC算法在PyBullet仿真环境中训练机械臂完成抓取任务。通过强化学习中的软Actor-Critic(SAC)算法,结合熵最大化机制和双Q网络架构,有效解决了机械臂控制中的探索难题。教程包含环境搭建、算法原理、状态空间设计、奖励函数优化等核心内容,并提供了实用的训练技巧和参数调优指南。

weixin_29091105的博客 361

UVA1412 基金管理 Fund Management

状态压缩,一个状态是一个九进制数,vector<vector >states对状态编号(编号>状态),map<vector,int>id(状态>编号)紫书的代码里用一个vector< int >表示状态,巧妙。 预处理编号为状态s下对股票i的进行买卖操作后得到的状态编号。 #include <iostream> #include <cstdio> #include <vector> #include <map&gt.

gyp0205的博客 164

信号削峰CFR基础知识介绍(一)

接下来,将得到的峰值分成若干段,在每一段中,仅保留该段内所有峰值中幅度最大的峰值。为了减少不必要的带外泄露,削峰后的信号将通过一个低通滤波器,以减少对应于削峰后信号中尖锐拐角的高频信号。首先,它识别出高于由目标PAPR确定的阈值的峰值。在峰值加窗算法中,削峰是通过在峰值区域将原始信号与一个加窗函数相乘来实现的,如下图所示。其中,w(n) 是一种常见的加窗函数,如凯撒窗、高斯窗和汉明窗等,而 p(n) 是一个加权系数。如上图所示,削峰会导致削峰后的信号出现尖锐的拐角,从而引发不必要的带外辐射(ACP增加)。

weixin_49761275的博客 1551

C++cgal库配置+VS2017

Cgal几何图形库在VS2017上的下载、安装与配置。想要一口气下载完所有安装配件的,可以去文章末尾的链接。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。

dsn3S的博客 1489

UVa1412 - Fund Management(状压dp【复杂)

题目链接简介: 你有c美元现金,没有股票,给你m天时间和n支股票供你购买,要求最后一天结束后不持有任何股票,且剩余的钱最多 已知每支股票每天的价格和参数si和ki,表示一手股票是si股,且每天持有的手数不能超过ki,其中k为每天持有的总手数上限。每天要么不操作,要么买一支股票,买或卖ta的一手股票 要求输出每一天的决策分析: 好像和这道题有点像bzoj1492(好像又不一样)每天持有的股票和

Coco_T的博客 616

Cadence Orcad Capture原理图断线的检查与避免方法

在设计电路图中,尤其是直接借鉴别人的设计进行二次开发的过程中难免会遇到如下尴尬的情况。有没有眼神好的朋友发现图纸的哪里有不对劲的地方呢?

fydar的博客 3269

UVa1412基金管理

题意 思路: 本题的基本思路是明确的,用d(i,p)表示经过 i 天之后,资产组合为p时的现金的最大值。 另外值得注意的是,本题在考虑买股票时要考虑到当前拥有的现金是否足够,因此不是一个DAG最长/最短路问题,因为某些边u->v的存在性依赖于起点到点u的最短路值。也就是说,本题不能像之前的DAG问题一样“反着定义”:如果用d(i,p)表示资产组合为p,从第 i 天开始到最后能拥有的现金最大...

CY05627的博客 423

剪映专业版教程:用AI生成音乐MV并重新制作画面—《漂泊与归梦》完全原创实战

本文详细拆解如何用AI生成音乐MV并重新制作画面的全流程。以歌曲《漂泊与归梦》为例,首先用AI将歌词转化为带音乐的MP4文件;导入剪映后分离音频并删除原视频,通过“识别字幕”功能提取歌词文本并逐句核对修正;接着设置“向右擦除”动画并锁定字幕轨道;最后根据歌词意境配置动漫、风景等非真人画面规避审核风险。教程涵盖从AI生成、音频分离、字幕提取到画面重制的每个环节,助你打造完全原创、无侵权风险的音乐短视频。

深耕计算机专业知识与技术。 1074

Java调用YOLOv26全解析:从ONNX模型部署到工业质检实战

本文分享了工业自动化领域使用Java调用YOLOv26进行零件缺陷检测的完整方案。通过YOLOv26s模型结合ONNX Runtime Java部署,误检率和漏检率显著降低(分别从12%降至2.1%,8%降至0.8%)。文章详细介绍了方案选型理由、环境配置避坑指南、ONNX模型导出步骤,以及Maven依赖配置(分CPU/GPU版本)。该方案直接在上位机Java环境中运行,避免了跨语言调用损耗,适合工业质检场景部署,提供了可复用的性能优化和多线程推理实现。

2601_94871597的博客 1108

[多维DP] UVa1412 基金管理(九元组及编解码)(状态池)

题目 思路 本题的基本思路是明确的,用d(i,p)表示经过i天之后,资产组合为p时的现金的最大值。 另外值得注意的是,本题在考虑买股票时要考虑到当前拥有的现金是否足够,因此不是一个DAG最长/最短路问题,因为某些边u-&gt;v的存在性依赖于起点到点u的最短路值。也就是说,本题不能像之前的DAG问题一样“反着定义”:如果用d(i,p)表示资产组合为p,从第i天开始到最后能拥有的现金最大值...

OI - IceCab 604

【读代码】SQLBot:开源自然语言转SQL智能助手原理与实践

SQLBot是 DataEase 团队开源的自然语言转 SQL 智能助手,致力于让非技术用户也能通过自然语言与数据库对话,自动生成 SQL 查询,实现自助数据分析、智能BI问答、报表生成等场景。SQLBot 结合了大语言模型(LLM)、数据库元数据解析、SQL解析与执行等多项技术,具备强大的多数据库适配能力和灵活的扩展性。降低数据分析门槛,让业务人员无需掌握SQL即可获取数据洞察支持多种数据库类型,适应企业多样化数据环境提供可扩展的API和插件机制,便于集成到各类BI、数据平台和业务系统。

kakaZhui的博客 829

uva1412 Fund Management

状压dp 要再看看 例题9-17 /* // UVa1412 Fund Management // 本程序会超时,只是用来示范用编码/解码的方法编写复杂状态动态规划的方法 // Rujia Liu #include<cstdio> #include<cstring> #include<map> using namespace s...

dengdouweng1282的博客 110

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

UVa 1412 Fund Management

本文研究基金管理人Frank在封闭式股票基金中的最优交易策略问题。基金有n支股票,管理期限m天,需满足手数限制、持仓限制和交易限制等约束条件。通过状态压缩方法表示持仓状态,使用动态规划框架设计状态转移方程,考虑持有、买入和卖出三种操作。算法采用预处理转移关系和操作编码优化,分析表明其复杂度在题目数据范围内可行。最终实现通过递归生成状态、初始化转移关系、动态规划更新状态和重构最优解四个步骤,为基金管理提供量化决策支持。

寂静山林 579

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

UVA 1412 Fund Management(复杂状态的动态规划 和指标函数值有关的状态转移)

题意:你有c(0.01≤c≤1e8)美元现金,但没有股票。给你m(1≤m≤100)天时间和n(1≤n≤8)支股票供你买卖,要求最后一天结束后不持有任何股票,且剩余的钱最多。买股票不能赊账,只能用现金买。已知每只股票每天的价格(0.01~999.99。单位是美元/股)与参数si和ki,表示一手股票是si(1≤si≤1e6)股,且每天持有的手数不能超过ki(1≤ki≤k),其中k为每天持有的总手数上限...

常胜将军的博客 327

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

UVA 1412 Fund Management——dp

思路不难,但是写起来真恶心,一定要注意模块化#include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &lt;map&gt; using namespace std; const int ...

hao_zong_yin的博客 472

Fund Management UVA - 1412 状压dp 状态的表示

太菜 看紫书代码看半天见注释 主要是状态难表达 转移倒是非常简单 #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;vector&gt; #include&lt;map&gt; using namespace std; const double INF = 1e30; const int maxn = 8; const i...

Bug___Maker的博客 280

例题 9-17 基金管理(Fund Management,ACM/ICPC NEERC 2007, UVa1412)

原题链接:https://vjudge.net/problem/UVA-1412 分类:复杂DP 备注:复杂状态的动态规划;和指函数有关的状态转移 以下代码和紫书代码没有任何区别… #include<bits/stdc++.h> using namespace std; const double INF=1e10; const int maxn=10; const int maxm=105; const int maxstate=15000; double c,price[maxn][maxm]

TK_wang_的博客 314

关于【动态规划】算法,我的一些通俗理解

目录一.解决的问题——多阶段的决策问题二.问题必须具备的性质2.1 最优子结构性质2.2 子问题重叠性质三.核心思想 一.解决的问题——多阶段的决策问题 我们需要知道,动态规划算法旨在解决这样一类问题——多阶段的决策问题。下面我们来详细介绍一下动态规划到底是什么意思?什么是多阶段的决策问题? 所谓多阶段决策过程是指这样一类决策过程:它可以把一个复杂问题按时间(或空间)分成若干个阶段,每个阶段都需要作出决策(选择),以便得到过程的最优结局。由于在每阶段采取的决策是与时间有关的而且前一阶段采取的决策如何,不但

未来科学研究所 1085

池,状态与无状态,服务器上下文

池(pooling):池化的服务器对象提前被构造和初如化·能限制实例的个数(最小值,最大值)·实例能被多个会话共享,用来支持更多用户的请求·当返回池中的时候实例必须复原·(池化的服务可以让WEB应用程序在用户之间共享)非池化的对象每次重新构造和初始化,并在返回服务器时析构·能限制最大实例数·每个会话使用一个实例·(非池化的GIS服务的实例为单独的用户所占有,当用

小小Giser在成长 1017

100道动态规划——14 UVA 1412 Fund Management 从刘汝佳dalao的代码里学到了很多。。。。

好吧。之所以有一段时间没有发100道动态规划系列了,一是最近有点事情,而是为了这道题刷了刷前面的数据结构那一章的题目。 我感觉这个代码里面学到了很多东西,因此就不说自己的感想了,全写在代码注释里面了,学习了。。// UVa1412 Fund Management // Rujia Liu #include #include #include #include using std::map; u

Sion 862

UVA1412FundManagement

对于这道题的了解还不够深入,这是一道需要我回过头来再仔细推敲的题。难点就在于解题过程的繁杂。还有一点一直都不明白,状态的数量为何一定小于15000.

qq_16603365的博客 396

动态规划(基金管理,uva 1412)

想了很久都没想明白为什么状态总数不超过13000种,找到了递推式,但觉得只能通过dp或枚举得到。 事先计算出所有可能的状态,然后构造一个状态转移表。 把程序每一个大的步骤都写在函数内,结构清晰。 频繁使用的函数封装起来,如update。 保存路径多开一个空间,这样找路径时就可以O(n)而不是O(n^2)。 递归倒序打印。 刷表法dp前要全部赋值一遍,代表从未访问过。 把一股的价格改为

xl2015190026的博客 607

UVA 1412 Fund Management (预处理+状压dp)

状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态。但是这样做用数组开不下,用map离散会T。 而实际上很多九进制数很多都是用不上的。因此类似uva 1601 Morning after holloween的思想,先dfs预处理出所有状态,用map将状态离散, 预处理出算出状态的转移DAG,而不是转移的时候在解码编码判断是否可行,然后一层一层bfs就行了。 附上测...

weixin_33827590的博客 204

UVA 1412 - Fund Management(用vector容器模拟状态的状压dp)

Frank is a portfolio manager of a closed-end fund for Advanced Commercial Markets (ACM ). Fund collects money (cash) from individual investors for a certain period of time and invests cash into variou

kalilili的专栏 1334
上一篇: UVA 1252 Twenty Question (集合DP,时间优化)
下一篇: UVA 12219 Common Subexpression Elimination
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值