acdream 1409 Musical 状压DP
链接:http://acdream.info/problem?
pid=1409
题意:整个国家有n座城市,每座城市有三种粉丝。
第一种一周看一场音乐剧,挑选的音乐剧是已经在周围城市播放上演过的次数最多的音乐剧中的随机一个。
另外一种每天看一场音乐剧,挑选的是在本城市上映的音乐剧中的随机一个。
第三种每天看一场音乐剧,挑选的是在本城市以及周围城市中上映的音乐剧中的随机一个。
周围的城市是指这座城市与当前城市之间存在路径。
我如今要带着一部音乐剧环游全国(能够坐飞机,不用走路径),每座城市呆一周,而且还存在其它m座城市在这n周内绕国上映(也可能放假),问我这个音乐剧所能吸引到的粉丝的总数的期望是多少。
思路:首先要模拟找出每座城市每周的上映音乐剧数量。每座城市每周周围的上映的音乐剧数,每一个音乐剧在每周每座城市内存在的信息数。
然后用状态压缩,dp[i][j]表示第i周状态为j的条件下能吸引到的粉丝总数。
这题比較繁琐。模拟过程比較蛋疼。
代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define PI acos(-1.0)
#define seed 31//131,1313
//#define LOCAL
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
double city[15][5];
bool vis[15][15][15];//音乐剧,周,城市
bool now[15][15][15];
int V[15][15];
int top[15];
int aa[15][15][15];//音乐剧,周。城市的信息数
int ans[15];
int road[15];
int Pow[15];
int cc[15][15];//周,城市的上映音乐剧数
int dd[15][15];//周,相邻以及本身上映的音乐剧数
double dp[15][1500];
int p[15][1500];
void init()
{Pow[0]=1;for(int i=1; i<=10; i++)Pow[i]=Pow[i-1]*2;return ;
}
int main()
{init();int n,m,kk,c;scanf("%d%d%d",&n,&m,&kk);for(int i=0; i<n; i++)scanf("%lf%lf%lf",&city[i][0],&city[i][1],&city[i][2]);for(int i=1; i<=m; i++){int u,v;scanf("%d%d",&u,&v);V[u-1][top[u-1]++]=v-1;V[v-1][top[v-1]++]=u-1;}for(int i=1; i<=kk; i++)//剧{for(int j=1; j<=n; j++)//周{scanf("%d",&c);c--;if(j!=1)for(int k=0; k<n; k++)vis[i][j][k]=vis[i][j-1][k];vis[i][j][c]=1;now[i][j][c]=1;cc[j][c]++;dd[j][c]++;for(int k=0; k<top[c]; k++)dd[j][V[c][k]]++;}}for(int i=1; i<=kk; i++) //音乐剧for(int j=1; j<=n; j++) //周for(int k=0; k<n; k++) //城市for(int l=0; l<top[k]; l++){if(vis[i][j][V[k][l]])aa[i][j][k]++;}int mos=(1<<n);for(int i=0; i<=n; i++)for(int j=0; j<mos; j++)dp[i][j]=-1;dp[0][0]=0;for(int i=1; i<=n; i++)//周{for(int j=1; j<mos; j++)//状态{for(int k=0; k<n; k++)//到的城市{//cout<<k<<endl;int res=0;if(j-Pow[k]<0)break;if(dp[i-1][j-Pow[k]]!=-1){for(int l=0; l<top[k]; l++)if(Pow[V[k][l]]&j)res++;int flag = 0;double tot = 0;for(int l=1; l<=kk; l++){if(aa[l][i][k]>res&&now[l][i][k]){flag = 1;break;}else if(aa[l][i][k]==res&&now[l][i][k])tot++;}double all = 0;if(flag == 0)all+=city[k][0]/(tot+1);all+=city[k][1]*7/(cc[i][k]+1);all+=city[k][2]*7/(dd[i][k]+1);for(int ii=0; ii<top[k]; ii++){int pos=V[k][ii];all+=city[pos][2]*7/(dd[i][pos]+1);}if(all+dp[i-1][j-Pow[k]]>dp[i][j]){dp[i][j]=all+dp[i-1][j-Pow[k]];p[i][j]=k;}}}}}int nn=mos-1;int way[15],ttt=0;for(int i=n; i>=1; i--){//cout<<p[i][nn]<<endl;way[ttt++]=p[i][nn];nn-=Pow[p[i][nn]];}printf("%.8lf\n",dp[n][mos-1]);for(int i=ttt-1;i>=0;i--){if(i==ttt-1)printf("%d",way[i]+1);else printf(" %d",way[i]+1);}printf("\n");return 0;
}
转载于:https://www.cnblogs.com/mengfanrong/p/5348274.html
acdream 1409 Musical 状压DP相关推荐
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- P2340 奶牛会展(状压dp)
P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
最新文章
- MySQL面试题 | 附答案解析(十五)
- RabbitMQ管理台使用
- qmoc文件_手动生成MOC文件
- 阿德莱德大学计算机语言班,阿德莱德大学——英语语言中心
- Git 命令大全整理
- java.net.url 中文乱码,.Net获取URL中文参数值的乱码问题解决方法总结
- Byval 和 ByRef 使用
- ORA-00376:file x cannot be read at this time
- 循环冗余校验 使用及记忆方法
- html 段前空格_前端 -- HTML
- window2008 、 oracle11.2g 无法imp,dmp。
- 微信公众号+web后台的工资条发放功能的实现
- iPhone怎么设置闹钟铃声?苹果手机自定义闹钟铃声教程
- cs局域网服务器未响应,电子竞技CS满十开打IP列表
- day13-搜索过滤
- php 微信支付 回调处理,TP微信支付(回调处理)
- Java基础知识总结1(数据类型)
- 1-丁基-3-甲基咪唑醋酸盐[Bmim][Ac]|离子液体1,1,3,3,-四甲基胍乳酸盐TMGL
- window xp 自动登陆系统
- zData 数据库一体机v5.4和 zDBM 数据库极速恢复平台v2.8正式发布!
热门文章
- Cool!15个超炫的 CSS3 文本特效【上篇】
- irrlicht v1.6 例程18 Splitscreen
- Unix环境高级编程学习笔记(七) 多线程
- 局域网共享问题全方位解决
- Matlab gatool使用方法
- MATLAB矩阵对称旋转
- matlab 值法确定各指标权重,Matlab学习系列19. 熵值法确定权重
- php private方法,php如何调用private方法
- java 鼠标拖动矩形_java – 用鼠标拖动创建矩形,而不是绘制
- 华为手机打字声音怎么开启_华为手机这5个超实用小功能,记得要开启,谁用都说好...