UVa 1412 Fund Management (预处理+状压DP)
题意:题意很难说清楚自己看原文,链接:UVa 1412 Fund Management
析:总体来说如果没有超时的话,这个题不是特别难,但是这个题很容易超时,主要是体现在状态转移时,很容易想到状态方程表示方法,
dp[i][s]表示第 i 天时状态为s时能获得的最大值,转移方程也很容易,三种决策,要么买,要么卖,要么不买不卖,就这三种,但是却不是好转移,
主要是效率不够,所以我们先预处理所有的状态转移,最后直接用就可以了。用的vector和map来存储状态和编号。
代码如下:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#define debug() puts("++++");
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std; typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-5;
const int maxn = 100000 + 10;
const int mod = 1e6;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c){
return r >= 0 && r < n && c >= 0 && c < m;
} const int maxstate = 15000;
int k[10], s[10], kk;
char name[10][100];
double price[10][110];
vector<vector<int> > states;
map<vector<int>, int> mp;
int buy_next[maxstate][10], sell_next[maxstate][10];
double dp[110][maxstate]; void dfs(int stock, vector<int>& lots, int tot){
if(stock == n){
mp[lots] = states.size();
states.push_back(lots);
return ;
}
for(int i = 0; i <= k[stock] && tot + i <= kk; ++i){
lots[stock] = i;
dfs(stock+1, lots, tot + i);
}
} void init(){
vector<int> lots(n);
states.clear();
mp.clear();
dfs(0, lots, 0);
for(int s = 0; s < states.size(); ++s){
int tot = 0;
for(int i = 0; i < n; ++i) tot += states[s][i];
for(int i = 0; i < n; ++i){
buy_next[s][i] = sell_next[s][i] = -1;
if(buy_next[s][i] < k[i] && tot < kk){ // buy
vector<int> tmp = states[s];
++tmp[i];
buy_next[s][i] = mp[tmp];
}
if(states[s][i] > 0){ // sell
vector<int> tmp = states[s];
--tmp[i];
sell_next[s][i] = mp[tmp];
}
}
}
} double c;
int opt[110][maxstate], pre[110][maxstate]; void update(int i, int s, int s2, double v, int o){
if(v > dp[i+1][s2]){
dp[i+1][s2] = v;
opt[i+1][s2] = o;
pre[i+1][s2] = s;
}
} double solve(){
for(int i = 0; i <= m; ++i)
for(int j = 0; j < states.size(); ++j)
dp[i][j] = -inf;
dp[0][0] = c;
for(int i = 0; i < m; ++i)
for(int s = 0; s < states.size(); ++s){
double v = dp[i][s];
if(v < -1) continue;
update(i, s, s, v, 0); //hold
for(int j = 0; j < n; ++j){
if(buy_next[s][j] >= 0 && v >= price[j][i] - 1e-3)
update(i, s, buy_next[s][j], v-price[j][i], j+1); //buy
if(sell_next[s][j] >= 0)
update(i, s, sell_next[s][j], v+price[j][i], -j-1); //sell
}
}
return dp[m][0];
} void print(int i, int s){
if(!i) return ;
print(i-1, pre[i][s]);
if(opt[i][s] == 0) printf("HOLD\n");
else if(opt[i][s] > 0) printf("BUY %s\n", name[opt[i][s]-1]);
else printf("SELL %s\n", name[-opt[i][s]-1], -opt[i][s]-1);
} int main(){
while(scanf("%lf %d %d %d", &c, &m, &n, &kk) == 4){
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 = solve();
printf("%.2f\n", ans);
print(m, 0);
}
return 0;
}
UVa 1412 Fund Management (预处理+状压DP)的更多相关文章
- UVa 1412 - Fund Management(状压DP + 预处理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 【暑假】[深入动态规划]UVa 1412 Fund Management
UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS Memory Limit: Unknown ...
- UVA 1412 Fund Management (预处理+状压dp)
状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态.但是这样做用数组开不下,用map离散会T. 而实际上很多九进制数很多都是用不上的.因此类似uva 1601 Mornin ...
- loj 1316(spfa预处理+状压dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...
- UVA - 1252 Twenty Questions (状压dp)
状压dp,用s表示已经询问过的特征,a表示W具有的特征. 当满足条件的物体只有一个的时候就不用再猜测了.对于满足条件的物体个数可以预处理出来 转移的时候应该枚举询问的k,因为实际上要猜的物品是不确定的 ...
- hdu 4568 Hunter(spfa预处理 + 状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...
- UVa 1252 - Twenty Questions(状压DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老 ...
- UVA 10572 Black & White (状压DP)
题意:有一个n*m的矩阵,其中部分格子已经涂黑,部分涂白,要求为其他格子也上黑/白色,问有多少种涂法可以满足一下要求: (1)任意2*2的子矩阵不可以同色. (2)所有格子必须上色. (3)只能有两个 ...
随机推荐
- hdu5387(2015多校8)--Clock(模拟)
题目链接:点击打开链接 题目大意:给出一个时间,问在钟表上这个时间的时候.时针和分针的角度,时针和秒针的角度.分针和秒针的角度.假设不是整数以分数的形式输出. 假设依照最小的格来算,那么: 1s对于秒 ...
- kubernetes高级之pod安全策略
系列目录 什么是pod安全策略 pod安全策略是集群级别的用于控制pod安全相关选项的一种资源.PodSecurityPolicy定义了一系列pod相要进行在系统中必须满足的约束条件,以衣一些默认的约 ...
- 《学习opencv》笔记——矩阵和图像操作——cvConvertScale,cvConvertScaleAbs,cvCopy and cvCountNonZero
矩阵和图像的操作 (1)cvConvertScale函数 其结构: void cvConvertScale( //进行线性变换,将src乘scale加上shift保存到dst const CvArr* ...
- 在JS中将JSON的字符串解析成JSON数据格式
使用eval函数来解析 <script> var data="{root: [{name:'1',value:'0'},{name:'6101',value:'北京市'},{na ...
- PHP收邮件receiveMail
用PHP来发邮件,相信大家都不陌生,但读取收件箱的话,接触就少了,这次总结下自己的经验,希望能够帮助大家. 注意:1.PHP读取收件箱主要是利用imap扩展,所以在使用下面方法前,必须开启imap扩展 ...
- # Playables API(翻译)
The Playables API provides a way to create tools, effects or other gameplay mechanisms by organi ...
- EasyCamera Android安卓移动视频监控单兵设备接入EasyDarwin开源流媒体云平台
前言 随着Android系统的不断更新和发展,现在越来越多的硬件产品选择用安卓系统作为运行环境,电视机,机顶盒.门禁.行车记录仪.车载系统.单兵设备等等,Android系统底层还是Linux,但对上层 ...
- MongoDB复制集架构搭建
创建目录 mkdir -p /data/r0 /data/r1 /data/r2 声明实例 ./bin/mongod --port 27017 --dbpath /home/workspace/dat ...
- three supported reliability levels: * End-to-end * Store on failure * Best effort
https://github.com/cloudera/flume/blob/master/flume-docs/src/docs/UserGuide/Introduction === Reliabi ...
- 在MFC中使用大漠插件
打开Class Wizard,Add Class...->MFC Class From TypeLib... File->Location->>> Finish-> ...