链接: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;
}

acdream 1409 Musical 状压DP的更多相关文章

  1. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  2. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  3. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  4. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  5. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  6. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  7. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  8. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

  9. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

随机推荐

  1. hdu 1115(计算多边形重心)

    题意:已知一多边形没有边相交,质量分布均匀.顺序给出多边形的顶点坐标,求其重心. 分析: 求多边形重心的题目大致有这么几种: 1,质量集中在顶点上.n个顶点坐标为(xi,yi),质量为mi,则重心 X ...

  2. 自定义View(二)--继承自ViewGroup

    自定义View包括很多种,上一次随笔中的那一种是完全继承自View,这次写的这个小Demo是继承自ViewGroup的,主要是将自定义View继承自ViewGroup的这个流程来梳理一下,这次的Dem ...

  3. 康乐不风流之爱解题的pde灌水王张祖锦

    康乐不风流之爱解题的pde灌水王张祖锦 师弟: 邓洪存 (现在烟台大学任教) 好吧, 我一直想写写康乐园里与我相熟的这几个人, 不如趁此机会开始. 第一批人物为张祖锦.苏延辉.张会春.黄显涛.刘兴兴. ...

  4. $("#province").val();取不到select的值求解

    MVC下的razor视图开发中无法取到select的值问题求解 cshtml 如下 <select name="province" id="province&quo ...

  5. Getting and installing the PEAR package manager

    Windows After you have downloaded and installed PHP, you have to manually execute the batch file loc ...

  6. Loadrunner 性能指标定位系统瓶颈

    判断CPU瓶颈 1, %processor time 平均值大于95 2, processor queue length大于2 (大于处理器个数+1).可以确定CPU瓶颈 3, CPU空闲时间为零(z ...

  7. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 select_from_list_by_label(self, locator, *labels)

    def select_from_list_by_label(self, locator, *labels): """Selects `*labels` from list ...

  8. 一个c++剧情脚本指令系统

    项目希望能够实现一些剧情动画,类似角色移动,镜头变化,台词展现等.剧情动画这东西随时需要修改调整,不能写死在代码里.考虑之后认为需要做一个简单的DSL来定制剧情脚本,策划在脚本里按顺序写入命令,然后我 ...

  9. 一步步实现Promise

    最近在https://github.com/ThoughtWorksInc/rest-rpc上工作,遇到了一个scala隐式转换的问题,简单的说是要实现这么个东西: implicit def json ...

  10. spark 连接 mysql 数据库

    在所有master和slave上也要在spark/conf/spark-conf.sh里面设置driver的classpath,解决编译找不到driver的问题 http://www.iteblog. ...