uva1412 Fund Management
状压dp
要再看看 例题9-17
/*
// UVa1412 Fund Management
// 本程序会超时,只是用来示范用编码/解码的方法编写复杂状态动态规划的方法
// Rujia Liu
#include<cstdio>
#include<cstring>
#include<map>
using namespace std; const double INF = 1e30;
const int maxn = 8;
const int maxm = 100 + 5; map<int, double> d[maxm];
map<int, int> opt[maxm], prevv[maxm];
int m, n, s[maxn], k[maxn], kk;
double c, price[maxn][maxm];
char name[maxn][10]; int encode(int* portfolio) {
int h = 0;
for(int i = 0; i < n; i++) h = h * 9 + portfolio[i];
return h;
} int decode(int h, int* portfolio) {
int totlot = 0;
for(int i = n-1; i >= 0; i--) {
portfolio[i] = h % 9;
totlot += portfolio[i];
h /= 9;
}
return totlot;
} void update(int oldh, int day, int h, double v, int o) {
if(d[day].count(h) == 0 || v > d[day][h]) {
d[day][h] = v;
opt[day][h] = o;
prevv[day][h] = oldh;
}
} double dp() {
int portfolio[maxn];
d[0][0] = c;
for(int day = 0; day < m; day++)
for(map<int, double>::iterator it = d[day].begin(); it != d[day].end(); it++) {
int h = it->first;
double v = it->second;
int totlot = decode(h, portfolio); update(h, day+1, h, v, 0); // HOLD
for(int i = 0; i < n; i++) {
if(portfolio[i] < k[i] && totlot < kk && v >= price[i][day] - 1e-3) {
portfolio[i]++;
update(h, day+1, encode(portfolio), v - price[i][day], i+1); // BUY
portfolio[i]--;
}
if(portfolio[i] > 0) {
portfolio[i]--;
update(h, day+1, encode(portfolio), v + price[i][day], -i-1); // SELL
portfolio[i]++;
}
}
}
return d[m][0];
} void print_ans(int day, int h) {
if(day == 0) return;
print_ans(day-1, prevv[day][h]);
if(opt[day][h] == 0) printf("HOLD\n");
else if(opt[day][h] > 0) printf("BUY %s\n", name[opt[day][h]-1]);
else printf("SELL %s\n", name[-opt[day][h]-1]);
} int main() {
int kase = 0;
while(scanf("%lf%d%d%d", &c, &m, &n, &kk) == 4) {
if(kase++ > 0) printf("\n");
for(int i = 0; i < n; i++) {
scanf("%s%d%d", name[i], &s[i], &k[i]);
for(int j = 0; j < m; j++) { scanf("%lf", &price[i][j]); price[i][j] *= s[i]; }
}
for(int i = 0; i <= m; i++) { d[i].clear(); opt[i].clear(); prevv[i].clear(); } double ans = dp();
printf("%.2lf\n", ans);
print_ans(m, 0);
}
return 0;
}
*/ #include<cstdio>
#include<cstring>
#include<vector>
#include<map>
using namespace std; const double INF = 1e30;
const int maxn = ;
const int maxm = + ;
const int maxstate = ; int m, n, s[maxn], k[maxn], kk;
double c, price[maxn][maxm];
char name[maxn][]; double d[maxm][maxstate];
int opt[maxm][maxstate], prevv[maxm][maxstate]; int buy_next[maxstate][maxn], sell_next[maxstate][maxn];
vector<vector<int> > states;
map<vector<int>, int> ID; void dfs(int stock, vector<int>& lots, int totlot) {
if(stock == n) {
ID[lots] = states.size();
states.push_back(lots);
}
else for(int i = ; i <= k[stock] && totlot + i <= kk; i++) {
lots[stock] = i;
dfs(stock+, lots, totlot + i);
}
} void init() {
vector<int> lots(n);
states.clear();
ID.clear();
dfs(, lots, );
for(int s = ; s < states.size(); s++) {
int totlot = ;
for(int i = ; i < n; i++) totlot += states[s][i];
for(int i = ; i < n; i++) {
buy_next[s][i] = sell_next[s][i] = -;
if(states[s][i] < k[i] && totlot < kk) {
vector<int> newstate = states[s];
newstate[i]++;
buy_next[s][i] = ID[newstate];
}
if(states[s][i] > ) {
vector<int> newstate = states[s];
newstate[i]--;
sell_next[s][i] = ID[newstate];
}
}
}
} void update(int day, int s, int s2, double v, int o) {
if(v > d[day+][s2]) {
d[day+][s2] = v;
opt[day+][s2] = o;
prevv[day+][s2] = s;
}
} double dp() {
for(int day = ; day <= m; day++)
for(int s = ; s < states.size(); s++) d[day][s] = -INF; d[][] = c;
for(int day = ; day < m; day++)
for(int s = ; s < states.size(); s++) {
double v = d[day][s];
if(v < -) continue; update(day, s, s, v, ); // HOLD
for(int i = ; i < n; i++) {
if(buy_next[s][i] >= && v >= price[i][day] - 1e-)
update(day, s, buy_next[s][i], v - price[i][day], i+); // BUY
if(sell_next[s][i] >= )
update(day, s, sell_next[s][i], v + price[i][day], -i-); // SELL
}
}
return d[m][];
} void print_ans(int day, int s) {
if(day == ) return;
print_ans(day-, prevv[day][s]);
if(opt[day][s] == ) printf("HOLD\n");
else if(opt[day][s] > ) printf("BUY %s\n", name[opt[day][s]-]);
else printf("SELL %s\n", name[-opt[day][s]-]);
} int main() {
int kase = ;
while(scanf("%lf%d%d%d", &c, &m, &n, &kk) == ) {
if(kase++ > ) printf("\n"); for(int i = ; i < n; i++) {
scanf("%s%d%d", name[i], &s[i], &k[i]);
for(int j = ; j < m; j++) { scanf("%lf", &price[i][j]); price[i][j] *= s[i]; }
}
init(); double ans = dp();
printf("%.2lf\n", ans);
print_ans(m, );
}
return ;
}
uva1412 Fund Management的更多相关文章
- 【暑假】[深入动态规划]UVa 1412 Fund Management
UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS Memory Limit: Unknown ...
- UVa 1412 Fund Management (预处理+状压DP)
题意:题意很难说清楚自己看原文,链接:UVa 1412 Fund Management 析:总体来说如果没有超时的话,这个题不是特别难,但是这个题很容易超时,主要是体现在状态转移时,很容易想到状态方程 ...
- UVa 1412 - Fund Management(状压DP + 预处理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1412 Fund Management (预处理+状压dp)
状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态.但是这样做用数组开不下,用map离散会T. 而实际上很多九进制数很多都是用不上的.因此类似uva 1601 Mornin ...
- POJ3570 Fund Management 动态规划
题目大意 Frank从个人投资者获得了c美元的资金,可用于m天的投资.Frank可以对n(n<=8)支股票进行投资.对于每一支股票:都有一个交易上限si,表示一天最多能交易的股数:还有一个上限k ...
- 近期做的一些DP
UVa 1625 color length https://blog.csdn.net/Dylan_Frank/article/details/52261424 https://www.cnblogs ...
- 7.25 9figting!
TEXT 87 Fund management基金管理 A Miller's tale 米勒传奇(陈继龙编译) Dec 7th 2006 From The Economist print edit ...
- 7.25 8figting!
TEXT 87 Fund management基金管理 A Miller's tale 米勒传奇(陈继龙编译) Dec 7th 2006 From The Economist print edit ...
- DP 题集 2
关于 DP 的一些题目 String painter 先区间 DP,\(dp[l][r]\) 表示把一个空串涂成 \(t[l,r]\) 这个子串的最小花费.再考虑 \(s\) 字符串,\(f[i]\) ...
随机推荐
- NOIP2007 矩阵取数游戏(区间DP)
传送门 这道题第一眼看上去可能让人以为是贪心……不过贪心并不行,因为每次的操作是有2的幂次方的权值的.这样的话直接每次贪心最小的就目光短浅.所以那我们自然想到了DP. 据说这是一道很正常的区间DP? ...
- you are the one(区间dp)
传送门 You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- scrollerView 滚动的时候改变 scrollerView 的背景色代码
要实现点击电池条的时候立即回到页面的顶部的时候注意: 只有当一个主控制器有一个scrollview 并把这个属性设置为yes,其他的scrollview.scrollsToTop = NO 这样才会响 ...
- CodeForces 719B Anatoly and Cockroaches (水题贪心)
题意:给定一个序列,让你用最少的操作把它变成交替的,操作有两种,任意交换两种,再就是把一种变成另一种. 析:贪心,策略是分别从br开始和rb开始然后取最优,先交换,交换是最优的,不行再变色. 代码如下 ...
- C++语言中的static关键字的作用是什么?
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量.在模块 ...
- IIS7的FTP出错: 451 No mapping for the unicode character exists in the target multi-byte code page
提示:IIS7的FTP出错: 451 No mapping for the unicode character exists in the target multi-byte code page 今天 ...
- 开发者神器!Windows上最强大的虚拟桌面工具-Dexpot
简介 : 用过Linux和Mac计算机的人都知道 , 这两个系统上都有个多桌面的功能非常使用 . 而在Windows上并没有该项功能 , 虽然目前Win10已经增加了多桌面的程序 , 但使用上仍体验不 ...
- js实时获取并显示当前时间的方法
- 正睿OI提高组十连测 day1 总结
可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...
- Angular4项目,默认的package.json创建及配置
1.使用如下命令,可以创建一个默认的 package.json npm init 创建后如下图所示: 添加 angular4 的 dependencies: npm install@ ...