题意:题意很难说清楚自己看原文,链接: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)的更多相关文章

  1. UVa 1412 - Fund Management(状压DP + 预处理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. 【暑假】[深入动态规划]UVa 1412 Fund Management

    UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS   Memory Limit: Unknown   ...

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

    状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态.但是这样做用数组开不下,用map离散会T. 而实际上很多九进制数很多都是用不上的.因此类似uva 1601 Mornin ...

  4. loj 1316(spfa预处理+状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...

  5. UVA - 1252 Twenty Questions (状压dp)

    状压dp,用s表示已经询问过的特征,a表示W具有的特征. 当满足条件的物体只有一个的时候就不用再猜测了.对于满足条件的物体个数可以预处理出来 转移的时候应该枚举询问的k,因为实际上要猜的物品是不确定的 ...

  6. hdu 4568 Hunter(spfa预处理 + 状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...

  7. UVa 1252 - Twenty Questions(状压DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)

    题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师.每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老 ...

  9. UVA 10572 Black & White (状压DP)

    题意:有一个n*m的矩阵,其中部分格子已经涂黑,部分涂白,要求为其他格子也上黑/白色,问有多少种涂法可以满足一下要求: (1)任意2*2的子矩阵不可以同色. (2)所有格子必须上色. (3)只能有两个 ...

随机推荐

  1. nginx 安装和配置文件说明

    1. 安装依赖包 yum install gcc gcc+ yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel 2 ...

  2. vmware workstation14永久激活密钥

    vmware workstation14永久激活密钥分享: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ZC3WK-AFXEK-488JP-A7MQX-XL8YF AC5XK-0ZD4 ...

  3. linux cat命令(转载)

    来源:http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html 1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具. 查看一 ...

  4. hdu5317 RGCDQ 统计

    // hdu5317 RGCDQ // // 题目大意: // // 给定一个闭区间[l,r],定义f(x)是x的不同的质因子的个数 // 比方: 12 = 2 * 2 * 3,是两种.所以f(x) ...

  5. 基于EasyIPCamera实现的RTSP跨平台拉模式转发流媒体服务器

    本文转自博客:http://blog.csdn.net/xinlanbobo/article/details/53224445 上一篇博客<EasyIPCamera通过RTSP协议接入海康.大华 ...

  6. 我的前端之旅-nodejs 安装静态的文件服务器 (1)

    一个最简单的 Web Server 之功能包含下列三个步骤:步骤一 : 接收浏览器所传来的网址:步骤二 : 取出相对应的文件:步骤三 : 将文件内容传回给浏览器.然而.在这个接收与传回的过程中,所有的 ...

  7. apk下载与安装

    public class MainActivity extends Activity { private File apkFile; @Override protected void onCreate ...

  8. leetcode 792. Number of Matching Subsequences

    Given string S and a dictionary of words words, find the number of words[i] that is a subsequence of ...

  9. SDUT 2402 水杯最小表面积问题

    水杯 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 天气逐渐变热了,准备考研的高童鞋打算在夏天来临之前自己动手造一个水杯,以备口 ...

  10. Java8初体验(1):lambda表达式语法

    原文出处: 一冰_天锦 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化 ...