Fund Management UVA

编程入门 行业动态 更新时间:2024-10-25 18:22:35

很有难度的一道题

将n元组映射成一个数字,既方便了状态的转移,也加快了时间,否则利用九进制去进行操作,很麻烦的

将所有状态都记录下来之后,股票的买个卖就可以抽象成一幅图了,也方便了状态转移

具体细节看代码吧

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<assert.h>
#include<vector>
#include<list>
#include<map>
#include<set>
#include<sstream>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
#pragma warning(disable:4996)
#define me(s)  memset(s,0,sizeof(s))
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
typedef pair <int, int> pii;
typedef long long ll;
typedef unsigned long long llu;
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-15;
const double INF = 1e30;
const int maxn = 8;
const int maxm = 100 + 5;
const int maxstate = 15000;int m, n, s[maxn], k[maxn], kk;
double c, price[maxn][maxm];
char name[maxn][10];double d[maxm][maxstate];
int opt[maxm][maxstate], pre[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 = 0; i <= k[stock] && totlot + i <= kk; i++) {lots[stock] = i;dfs(stock + 1, lots, totlot + i);}
}void init() {vector<int> lots(n);states.clear();ID.clear();dfs(0, lots, 0);for (int s = 0; s < states.size(); s++) {int totlot = 0;for (int i = 0; i < n; i++) totlot += states[s][i];for (int i = 0; i < n; i++) {buy_next[s][i] = sell_next[s][i] = -1;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] > 0) {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 + 1][s2]) {d[day + 1][s2] = v;opt[day + 1][s2] = o;pre[day + 1][s2] = s;}
}double dp() {for (int day = 0; day <= m; day++)for (int s = 0; s < states.size(); s++) d[day][s] = -INF;d[0][0] = c;for (int day = 0; day < m; day++)for (int s = 0; s < states.size(); s++) {double v = d[day][s];if (v < -1) continue;update(day, s, s, v, 0); // HOLDfor (int i = 0; i < n; i++) {if (buy_next[s][i] >= 0 && v >= price[i][day] - 1e-3)update(day, s, buy_next[s][i], v - price[i][day], i + 1); // BUYif (sell_next[s][i] >= 0)update(day, s, sell_next[s][i], v + price[i][day], -i - 1); // SELL}}return d[m][0];
}void print_ans(int day, int s) {if (day == 0) return;print_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]);
}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]; }}init();double ans = dp();printf("%.2lf\n", ans);print_ans(m, 0);}return 0;
}

 

更多推荐

Fund,Management,UVA

本文发布于:2023-05-29 21:34:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/353326.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Fund   Management   UVA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!