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;
}
acdream 1409 Musical 状压DP的更多相关文章
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...
随机推荐
- php 序列化(serialize)格式详解
1.前言 PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize.unserialize.不过在 PHP 手册中对这两个函数的说明仅限于如何使用,而对序列 ...
- ubuntu切换root
sudo passwd root这个命令是给root用户设定密码.然后su root切换到root用户.
- RandomAcessFile、MappedByteBuffer和缓冲读/写文件
项目需要进行大文件的读写,调查测试的结果使我决定使用MappedByteBuffer及相关类进行文件的操作,效果不是一般的高. 网上参考资源很多,如下两篇非常不错: 1.花1K内存实现高效I/O的Ra ...
- zzzzz
Extension Method: Return another string if string is null or emptyJust a tiny little extension metho ...
- angularJS+requireJS并集成karma测试实践
最近在为下一个项目做前端技术选型,Angular是必须要用的(BOSS指定,个人感觉也不错,开发效率会很高).由于需要加载的JS很多,所以打算看看angular和requirejs一起用会怎么样.在g ...
- Javascript 日期时间格式正则
因为Javascript的日期格式判断可能因浏览器的版本有所不同,所以用正则判断会比较好,这里备注一个正则用来判断日期时间的格式: ^(?=\d)(?:(?!(?:1582(?:\.|-|\/)10( ...
- jQuery对select标签的常用操作
1.获取当前选中项的value. $("#selector").val(); 2.获取当前选中项的text. $("#selector").find(" ...
- strcpy基本用法
C语言标准库函数strcpy,把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间. C语言函数 原型声明:extern char *strcpy(char* dest, co ...
- effective c++:virtual函数的替代方案
绝不重新定义继承来的缺省值 首先明确下,虚函数是动态绑定,缺省参数值是静态绑定 // a class for geometric shapes class Shape { public: enum S ...
- kali2 ssh
vi /etc/ssh/sshd_config 1.将#PasswordAuthentication no的注释去掉,并且将NO修改为YES 2.将#PermitRootLogin without-p ...