HDU 4049 Tourism Planning(状压DP)题解
题意:m个城市,n个人,让这n个人按固定顺序走遍m个城市。每个城市有一个单人票价pi。每个人在每个城市能获得vij的价值。如果多个人在同一城市,那么会额外获得价值,给出一张n * n价值表,额外价值为任意两个组成队伍的价值和。每个人可以在中途退出,但是退出后不能再回来。问终点后最大价值。
思路:dp[st][i]表示在i城市状态st的最大价值,然后打表打出st的所有子集,每次都往子集转移。
代码:
- #include<set>
- #include<map>
- #include<cmath>
- #include<queue>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include <iostream>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- const int maxn = 10 + 5;
- const int M = maxn * 30;
- const ull seed = 131;
- const int INF = 0x3f3f3f3f;
- const int MOD = 1e4 + 7;
- int dp[1 << maxn][maxn];
- int p[maxn], v[maxn][maxn], b[maxn][maxn];
- int eachother[1 << maxn], one[1 << maxn];
- int nex[1 << 10][1 << 10 + 5], cnt[1 << 10];
- int n, m;
- int main(){
- memset(cnt, 0, sizeof(cnt));
- for(int i = 0; i < (1 << 10); i++){
- for(int j = 0; j <= i; j++){
- if((i & j) == j)
- nex[i][cnt[i]++] = j;
- }
- }
- while(~scanf("%d%d", &n, &m) && n + m){
- for(int i = 0; i < m; i++) scanf("%d", &p[i]);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < m; j++)
- scanf("%d", &v[i][j]);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < n; j++)
- scanf("%d", &b[i][j]);
- memset(eachother, 0, sizeof(eachother));
- for(int i = 0; i < (1 << n); i++){
- for(int j = 0; j < n; j++){
- if(!((1 << j) & i)) continue;
- for(int k = j + 1; k < n; k++){
- if(!((1 << k) & i)) continue;
- eachother[i] += b[j][k];
- }
- }
- }
- memset(dp, -INF, sizeof(dp));
- for(int i = 0; i < (1 << n); i++){
- dp[i][0] = 0;
- for(int j = 0; j < n; j++){
- if((1 << j) & i) dp[i][0] += v[j][0] - p[0];
- }
- dp[i][0] += eachother[i];
- }
- for(int i = 0; i < m - 1; i++){
- for(int j = 0; j < (1 << n); j++){
- for(int k = 0; k < cnt[j]; k++){
- int st = nex[j][k];
- int now = dp[j][i];
- for(int f = 0; f < n; f++){
- if((1 << f) & st) now += v[f][i + 1] - p[i + 1];
- }
- now += eachother[st];
- dp[st][i + 1] = max(dp[st][i + 1], now);
- }
- }
- }
- int ans = 0;
- for(int i = 0; i < (1 << n); i++){
- if(ans < dp[i][m - 1]){
- ans = dp[i][m - 1];
- }
- }
- if(ans > 0) printf("%d\n", ans);
- else printf("STAY HOME\n");
- }
- return 0;
- }
HDU 4049 Tourism Planning(状压DP)题解的更多相关文章
- hdu 4049 Tourism Planning [ 状压dp ]
传送门 Tourism Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 4272 LianLianKan (状压DP+DFS)题解
思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...
- HDU 4272 LianLianKan(状压DP)题解
题意:一个栈,每次可以选择和栈顶一样的数字,并且和栈顶距离小于6,然后同时消去他们,问能不能把所有的数消去 思路:一个数字最远能消去和他相距9的数,因为中间4个可以被他上面的消去.因为还要判断栈顶有没 ...
- HDU 4628 Pieces(状压DP)题解
题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- hdu 3681(bfs+二分+状压dp判断)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
随机推荐
- 百度文库Word下载器
最近我妈的文库VIP用完了,但还有很多资源要下载,于是我便在网上找下载工具. 总算找到个完美的!(虽然没界面) 既然没界面,那就自己写一个呗! 原作者 该程序的下载和写入部分由地球守卫者制作 原文链接 ...
- libuv中实现tcp服务器
目录 1.说明 2.libuv的tcp server 3.API简介 3.1.uv_tcp_init 3.2.uv_ip4_addr 3.3.uv_tcp_bind 3.4.uv_listen 3.5 ...
- eNSP启动设备AR1失败记一次解决步骤
eNSP稳定版本下载: 微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...
- 广告召回 Query-Ad Matching
小结: 1.最为基础的召回链路就是要保证召回层的相关性,但是相关性高的广告并不一定具有很高的商业价值,所以开始尝试将一些商业化业务指标作为召回的依据 百度凤巢新一代广告召回系统--"莫比乌斯 ...
- 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改
来源连接 http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...
- 线性DP总结(studying
写在前面 虽然都说线性DP是入门,但我还是今天才开始学 线性DP就是珂以通过线性处理得出答案的一种DP 每一种状态都可以从前面推得,并且推导过程是呈线性的 参考题单(本人现在主要用luogu,所以这些 ...
- SpringMVC听课笔记(十三:使用拦截器)
1.定义一个拦截器: 实现 HandlerInterceptor接口 2. 配置 3.运行流程 4.也可以通过<mvc:mapping>给拦截器设定特定的拦截路径,或者<mvc:ex ...
- 项目action:前台传多个dataWrap给后台
业务描述:当前台需要向后台传递多个dataWrap时,需要给后台action加上一段方法,才可以获取到额外的dataWrap. @Override public List<String> ...
- 23.centos 7配置网络
1.ifconfig:查看网卡信息 如果centos7 最小化安装没有ifconfig这个命令,可以使用yum install net-tools 来安装. centos7 网卡命名规则: en ...
- linux 一分钟安装maven linux
mkdir maven cd maven/ wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/ ...