状压dp,每个状态可以表示为一个n元组,且上限为8,可以用一个九进制来表示状态。但是这样做用数组开不下,用map离散会T。

而实际上很多九进制数很多都是用不上的。因此类似uva 1601 Morning after holloween的思想,先dfs预处理出所有状态,用map将状态离散,

预处理出算出状态的转移DAG,而不是转移的时候在解码编码判断是否可行,然后一层一层bfs就行了。

附上测试数据

一层一层的bfs转移类似滚动数组,注意初始化(具体问题具体分析,有些问题没有必要做这一步)

一层一层的bfs,0.293s

#include<bits/stdc++.h>
using namespace std;
const int maxn = , maxm = ;
double c;
int m,n,K; const int maxlen = ;
char names[maxn][maxlen]; int k[maxn];
double price[maxn][maxm]; typedef vector<int> State;
vector<State> states;
#define PB push_back map<State,int> ID;
map<State,int>:: iterator it;
#define MP make_pair
#define fi first
#define se second const int maxst = ; State st;
void GetAllSta(int i)
{
if(i == n){
ID.insert(MP(st,states.size()));
states.PB(st);
return;
}
for(int j = ; j <= k[i] && st[n]+j <= K; j++){
st[i] = j;
st[n]+=j;
GetAllSta(i+);
st[n]-=j;
}
} int buy[maxst][maxn],sell[maxst][maxn]; void buildDAG()
{
st.resize(n+);
if(states.size()) states.clear();
ID.clear();
GetAllSta();
for(int s = ; s < states.size(); s++){
State &cur = states[s];
for(int i = ; i < n; i++){
buy[s][i] = sell[s][i] = -;
if(cur[i] < k[i] && cur[n] <K){
cur[i]++; cur[n]++;
buy[s][i] = ID[cur];
cur[i]--; cur[n]--;
}
if(cur[i]>){
cur[i]--; cur[n]--;
sell[s][i] = ID[cur];
cur[i]++; cur[n]++;
}
}
}
} double dp[][maxst];
int pre[maxm-][maxst];
int opt[maxm-][maxst]; void updata(int u,int v,double money,double *nxt,int day,int op,vector<int>* tomorrow)
{
if(nxt[v] < money ){
if(nxt[v] < -1.0){
tomorrow->PB(v);
}
opt[day][v] = op;
pre[day][v] = u;
nxt[v] = money; }
} vector<int> V1,V2;
void bfs()
{
V1.clear(); V2.clear();
int sz = states.size();
fill(dp[],dp[]+sz+,-);
vector<int>* today = &V1, *tomorrow = &V2;
today->PB(); dp[][] = c;
for(int day = ; day < m; day++){
double *const&cur = dp[day&], *const&nxt = dp[day&^];
fill(nxt,nxt+sz+,-);
int tsz = today->size();
for(int j = ; j < tsz; j++){
int s = (*today)[j];
double money = cur[s];
updata(s,s,money,nxt,day,,tomorrow);
for(int i = ; i < n; i++){
double stockPrice = price[i][day];
if(sell[s][i] >= ){
updata(s,sell[s][i],money+stockPrice,nxt,day,-i-,tomorrow);
}
if(buy[s][i] >= && money >= price[i][day] ){
updata(s,buy[s][i],money-stockPrice,nxt,day,i+,tomorrow);
}
}
}
swap(today,tomorrow);
tomorrow->clear();
}
} void read()
{
for(int i = ; i < n; i++){
int s; scanf("%s%d%d",names[i],&s,k+i);
for(int j = ; j < m; j++){
scanf("%lf",price[i]+j);
price[i][j] *= s;
}
}
} void print_ans()
{
int ans[maxm], u = ;
printf("%lf\n",max(dp[m&][u],dp[m&^][u]));
for(int i = m-; i >= ; i--){
ans[i] = opt[i][u];
u = pre[i][u];
}
for(int i = ; i < m; i++){
int t = ans[i];
if(t){
if(t>) printf("BUY %s\n",names[t-]);
else printf("SELL %s\n",names[-t-]);
}else puts("HOLD");
} } int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%lf%d%d%d",&c,&m,&n,&K)){
read();
buildDAG();
bfs();
print_ans();
}
return ;
}

直接按时间dp,0.199s

#include<bits/stdc++.h>
using namespace std;
const int maxn = , maxm = ;
double c;
int m,n,K; const int maxlen = ;
char names[maxn][maxlen]; int k[maxn];
double price[maxn][maxm]; typedef vector<int> State;
vector<State> states;
#define PB push_back map<State,int> ID;
map<State,int>:: iterator it;
#define MP make_pair
#define fi first
#define se second const int maxst = ; State st;
void GetAllSta(int i)
{
if(i == n){
ID.insert(MP(st,states.size()));
states.PB(st);
return;
}
for(int j = ; j <= k[i] && st[n]+j <= K; j++){
st[i] = j;
st[n] += j;
GetAllSta(i+);
st[n] -= j;
}
} int buy[maxst][maxn],sell[maxst][maxn]; void buildDAG()
{
st.resize(n+);
states.clear();
ID.clear();
GetAllSta();
for(int s = ; s < states.size(); s++){
State &cur = states[s];
for(int i = ; i < n; i++){
buy[s][i] = sell[s][i] = -;
if(cur[i] < k[i] && cur[n] < K){
cur[i]++; cur[n]++;
buy[s][i] = ID[cur];
cur[i]--; cur[n]--;
}
if(cur[i]>){
cur[i]--; cur[n]--;
sell[s][i] = ID[cur];
cur[i]++; cur[n]++;
}
}
}
} double d[][maxst];
int pre[maxm-][maxst];
int opt[maxm-][maxst]; void updata(int u,int v,double money,double *nxt,int day,int op)
{
if(nxt[v] < money){
nxt[v] = money;
opt[day][v] = op;
pre[day][v] = u;
}
} void dp()
{
int sz = states.size();
fill(d[],d[]+sz+,-);
d[][] = c;
for(int day = ; day < m; day++){
double *today = d[day&], (&tomorrow)[maxst] = d[(day&)^];
fill(tomorrow,tomorrow+sz+,-);
for(int s = ; s < sz; s++) {
double mon = today[s];
if(mon < -) continue;
updata(s,s,mon,tomorrow,day,);
for(int i = ; i < n; i++){
double val = price[i][day];
if(buy[s][i] >= && mon >= val){
updata(s,buy[s][i],mon-val,tomorrow,day,i+);
}
if(sell[s][i] >= ){
updata(s,sell[s][i],mon+val,tomorrow,day,-i-);
}
}
}
}
} void read()
{
for(int i = ; i < n; i++){
int s; scanf("%s%d%d",names[i],&s,k+i);
for(int j = ; j < m; j++) {
scanf("%lf",price[i]+j);
price[i][j] *= s;
}
}
} void print_ans()
{
int ans[maxm], u = ;
printf("%lf\n",d[m&][]);
for(int i = m-; i >= ; i--){
ans[i] = opt[i][u];
u = pre[i][u];
}
for(int i = ; i < m; i++){
int t = ans[i];
if(t){
if(t>) printf("BUY %s\n",names[t-]);
else printf("SELL %s\n",names[-t-]);
} else puts("HOLD");
} } int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%lf%d%d%d",&c,&m,&n,&K)){
read();
buildDAG();
dp();
print_ans();
}
return ;
}

附上1组测试数据

8765.43
EKXOU
497.60 572.49 777.30 798.74 856.42 907.12 951.80 973.32 997.39 428.54 285.77 21.88 15.36 11.55 6.48 5.64 4.73 0.35 0.10 511.06 825.53 961.92 962.12 989.97 994.93 996.52 997.17 999.80 999.87 124.40 60.90 27.93 16.15 1.18 0.49 0.08 0.01 0.01 0.01 482.35 502.45 689.55 894.80 943.09 968.54 978.27 981.05 990.68 998.48 180.68 51.73 10.82 1.58 1.41 1.35 1.00 0.91 0.09 0.07 264.18 389.68 861.28 924.38 930.49 987.65 994.23 994.57 997.81 998.38 0.09 0.04 0.03 0.03 0.02 0.02 0.02 0.01 0.01 0.01 764.88 784.31 881.75 979.84 995.53 995.88 999.45 999.50 999.50 999.88 51.96 41.72 0.31 0.08 0.02 0.02 0.02 0.02 0.01 0.01 783.83
TOJIX
337.36 798.61 959.78 974.23 974.66 980.52 985.75 988.00 997.75 202.70 22.45 9.80 9.75 1.37 1.25 0.08 0.07 0.01 0.01 453.79 956.23 974.28 975.82 984.13 997.62 998.44 999.34 999.55 999.70 720.60 279.71 263.45 125.87 19.68 2.05 0.34 0.19 0.18 0.09 956.28 983.92 998.93 999.21 999.49 999.94 999.95 999.97 999.98 999.99 420.16 201.90 171.95 105.75 55.79 5.57 2.35 0.29 0.26 0.07 287.31 833.57 923.40 973.86 989.51 996.69 998.67 999.51 999.76 999.96 592.20 253.01 135.07 47.59 36.20 20.77 4.27 2.15 2.08 0.41 824.65 844.61 914.04 946.35 986.53 993.71 998.21 999.08 999.74 999.81 31.97 6.57 0.89 0.87 0.28 0.06 0.06 0.06 0.04 0.02 543.05
YPBR
261.13 726.56 902.28 968.30 986.36 990.99 992.91 997.18 998.05 620.09 544.18 109.24 105.36 102.12 92.24 71.58 11.44 10.93 10.48 949.78 979.18 999.29 999.73 999.94 999.97 999.99 999.99 999.99 999.99 303.75 32.27 19.46 3.00 0.68 0.57 0.07 0.05 0.05 0.05 847.31 875.92 878.64 948.43 950.97 962.84 998.62 999.77 999.83 999.91 792.80 732.09 518.26 300.41 266.92 254.44 120.94 97.95 50.42 0.22 949.73 955.52 960.78 969.87 989.54 990.62 997.12 998.91 998.92 999.95 435.46 244.96 105.08 83.05 71.16 57.48 0.35 0.26 0.04 0.03 672.62 674.93 994.14 998.04 999.76 999.95 999.98 999.99 999.99 999.99 890.88 587.16 522.23 198.58 48.06 43.10 8.27 8.16 2.78 2.09 654.25
DMQHU
786.12 989.55 998.11 998.79 999.06 999.51 999.99 999.99 999.99 329.96 234.31 213.10 50.98 25.55 9.33 6.15 4.62 3.76 1.45 473.40 861.35 891.83 893.32 994.48 994.82 995.74 997.51 999.60 999.61 1.60 0.10 0.04 0.03 0.02 0.02 0.02 0.01 0.01 0.01 955.63 962.79 991.17 997.12 997.78 999.24 999.52 999.56 999.90 999.97 248.19 21.63 17.23 0.77 0.15 0.02 0.01 0.01 0.01 0.01 645.78 794.76 945.82 951.66 957.98 969.25 979.61 983.05 999.01 999.98 142.88 48.33 6.78 1.40 0.30 0.11 0.01 0.01 0.01 0.01 455.03 961.87 971.42 993.53 994.89 999.22 999.40 999.49 999.97 999.98 572.16 101.80 11.67 5.90 3.43 0.95 0.52 0.35 0.02 0.01 30.77
PA
171.57 814.60 880.12 930.74 999.37 999.85 999.94 999.95 999.99 616.08 337.98 275.98 268.51 144.13 73.64 9.64 5.77 3.64 1.16 635.71 887.63 942.64 973.01 988.12 988.27 997.58 998.96 999.49 999.63 595.22 61.20 54.08 45.03 30.42 15.34 1.37 1.13 0.27 0.13 315.10 713.86 918.35 924.16 934.51 946.22 986.08 991.68 997.52 997.85 910.50 385.99 38.53 23.88 9.77 4.83 1.56 1.12 1.08 0.59 798.72 925.88 991.50 994.57 999.42 999.45 999.74 999.96 999.96 999.98 409.21 306.84 13.02 5.35 1.71 1.09 0.05 0.05 0.01 0.01 461.25 580.76 659.42 820.34 934.58 979.96 983.33 993.69 995.64 996.48 217.36 102.03 55.09 1.02 0.07 0.04 0.03 0.01 0.01 0.01 756.52
GDXR
315.11 980.66 994.48 996.51 999.23 999.27 999.43 999.98 999.98 474.90 467.57 332.03 259.91 237.15 201.72 7.17 2.86 2.86 1.84 650.61 751.90 770.80 893.72 969.27 980.07 992.74 999.52 999.70 999.89 990.81 893.66 304.11 283.43 159.01 25.83 18.51 5.64 2.78 0.61 753.95 879.59 931.70 952.85 960.27 984.89 997.82 999.81 999.84 999.86 31.61 22.43 8.18 6.64 6.01 1.96 0.82 0.33 0.30 0.22 476.24 680.51 737.71 958.51 962.28 999.90 999.90 999.95 999.97 999.99 817.03 80.43 35.66 0.16 0.08 0.04 0.01 0.01 0.01 0.01 639.87 907.28 966.39 991.41 994.12 999.86 999.94 999.98 999.98 999.99 790.20 95.68 26.30 11.24 3.25 2.46 2.38 0.94 0.41 0.35 46.40
EHCN
36.99 751.66 794.23 984.85 991.56 995.68 995.84 998.77 999.24 362.81 331.16 56.41 47.53 3.28 3.26 2.10 0.46 0.05 0.04 426.68 789.10 883.32 972.42 982.25 992.18 999.99 999.99 999.99 999.99 861.04 780.38 1.12 0.05 0.05 0.01 0.01 0.01 0.01 0.01 822.44 874.05 974.89 978.78 999.96 999.96 999.98 999.99 999.99 999.99 237.58 43.68 32.98 19.61 7.45 2.53 1.39 0.88 0.65 0.23 55.26 638.65 727.28 832.58 995.85 999.88 999.95 999.95 999.99 999.99 447.03 329.97 247.45 31.78 1.85 1.56 1.38 1.29 1.21 1.14 863.62 954.56 981.69 982.01 986.16 991.74 998.82 999.49 999.52 999.54 586.70 151.55 104.38 71.89 5.38 2.25 0.78 0.48 0.19 0.06 11.43
LSEDH
678.83 957.20 975.00 999.45 999.97 999.98 999.98 999.98 999.98 785.99 712.30 476.84 87.14 36.88 25.14 10.90 1.70 1.04 0.04 799.70 983.34 992.55 993.58 994.11 994.86 996.95 998.88 999.82 999.85 759.48 560.12 180.82 61.18 40.45 10.25 6.36 5.09 3.91 1.43 955.45 993.56 993.96 999.00 999.69 999.88 999.90 999.96 999.98 999.99 165.77 144.71 54.31 40.19 27.33 26.45 3.48 0.85 0.29 0.16 119.74 760.63 976.18 987.90 996.92 999.90 999.95 999.96 999.96 999.98 357.32 175.40 7.05 2.21 1.42 0.82 0.57 0.07 0.07 0.01 648.07 833.15 972.96 993.92 996.42 999.70 999.75 999.75 999.79 999.92 917.38 168.10 152.48 61.59 33.33 19.03 10.88 2.79 2.65 2.23 509.18

测试数据的答案

298113.06
BUY EHCN
BUY EKXOU
BUY PA
SELL EHCN
BUY EKXOU
HOLD
SELL PA
SELL EKXOU
SELL EKXOU
HOLD
HOLD
BUY EKXOU
BUY EKXOU
BUY EHCN
BUY EKXOU
BUY EKXOU
BUY EHCN
BUY EKXOU
BUY EKXOU
HOLD
SELL EKXOU
BUY GDXR
SELL EHCN
SELL EKXOU
SELL EKXOU
SELL EHCN
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL GDXR
HOLD
BUY EHCN
BUY EHCN
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EKXOU
SELL EHCN
BUY EKXOU
SELL EHCN
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
HOLD
HOLD
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY PA
BUY EHCN
BUY EKXOU
BUY EHCN
SELL PA
BUY EKXOU
SELL EKXOU
SELL EKXOU
SELL EHCN
SELL EHCN
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
HOLD
HOLD
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EKXOU
BUY EHCN
BUY EHCN
SELL EHCN
BUY EKXOU
SELL EHCN
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
SELL EKXOU
HOLD
HOLD
HOLD
HOLD
HOLD
HOLD
HOLD
HOLD
HOLD
BUY EKXOU
SELL EKXOU

一开始想用dfs+回溯,T了,意识到dfs的话没有用到最优子结构的性质,用九进制+map离散保存状态dp,又T了,

改成预处理出DAG,然后bfs终于过了。

UVA 1412 Fund Management (预处理+状压dp)的更多相关文章

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

    题意:题意很难说清楚自己看原文,链接:UVa 1412 Fund Management 析:总体来说如果没有超时的话,这个题不是特别难,但是这个题很容易超时,主要是体现在状态转移时,很容易想到状态方程 ...

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

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

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

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

  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. CodeForces - 566D Restructuring Company 并查集的区间合并

    Restructuring Company Even the most successful company can go through a crisis period when you have ...

  2. E20190226-hm

    shallow  adj. 浅的,肤浅的; 表面的,皮毛的; (水,器物等) 浅的; (呼吸) 浅的;  n. 浅处; 浅滩;

  3. 根运动 (Root Motion) – 工作原理

    http://blog.csdn.net/myarrow/article/details/45505085 1. 基本概念 在Unity3D动画中,模型的位置.角度经常会发生变化,我们需要决定是否将模 ...

  4. jzoj5991. 【北大2019冬令营模拟2019.1.6】Juice

    题面 题解 好迷-- //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define ...

  5. noip2017普及组

    过了这么久才来写博客,也是我这么一段时间都很低迷吧.... 老实来说,今年应该是要打提高组的...可还是打了普及组... 其实最猥琐的还是我连普及都写挂了,作为一个学了两年的人,图论,进阶dp都写过的 ...

  6. 2019最好用的自动化测试工具Top 10,果断收藏!

    经常有人在公众号留言或是后台问我,做自动化测试用哪个工具好,或是学哪门编程语言好呢? 这个时候总是无奈的说: 你应该学习Python 或是Java. 你应该掌握Selenium. 又或者你需要学会jm ...

  7. POP页面暂时不销毁

    摘要:我们经常使用的QQ空间,当我们短时间内两次进入页面的时候,页面是没有重新创建的,不光是缓存的数据,是整个页面都没有变.我们在开发中可能也会有这样的需求.开始的时候,想的思路是这样的:用定时器,将 ...

  8. [转]nopcommerce之权限模块

    本文转自:http://www.nopchina.net/category/%E6%9E%B6%E6%9E%84.html 这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce ...

  9. SpringMVC中,前台jsp封装参数,绑定参数,传递参数到后台controller的过程详解

    前台到后台的流程:前台jsp->后台:controller控制器层->service业务层->DAO数据访问层->数据库model模型层. 从上面流程可知,前台jsp的数据,想 ...

  10. OAuth2.0基本原理及应用

    OAuth2.0基本原理及应用 一.OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 在详细讲解OAuth 2.0之前,需要了解几个专 ...