dp练习 2016.2.24

很经典的一道状压dp(似乎叫做旅行商问题),用f[i][s]表示在到达点i,已经经过的城市用二进制表示为s,于是方程就很简单了:
f[i][s] = min { f[j][s ^ (1 << j)] + dis[j][i]| s & (1 << j) != 0}
然后用记忆化搜索即可,注意方向,因为dis[i][j]可能不等于dis[j][i]。(下面的代码某个处理似乎没有必要)
Code
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
typedef bool boolean;
#define INF 0xfffffff
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
template<typename T>
inline void readInteger(T& u){
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-');
if(x == '-'){
x = getchar();
aFlag = -;
}
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
u *= aFlag;
} int n;
int dis[][];
int f[][( << )];
boolean vis[][( << )]; inline void init() {
readInteger(n);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
readInteger(dis[i][j]);
for(int i = ; i <= n; i++)
dis[i][] = dis[i][], dis[][i] = dis[][i];
} int dfs(int local, int status) {
if(vis[local][status]) return f[local][status];
vis[local][status] = true;
for(int i = ; i <= n; i++) {
if(status & ( << i)) {
int ret = dfs(i, status ^ ( << i));
smin(f[local][status], f[i][status ^ ( << i)] + dis[i][local]);
}
}
return f[local][status];
} inline void solve() {
memset(vis, false, sizeof(vis));
memset(f, 0x7f, sizeof(f));
vis[][] = true;
f[][] = ;
int res = dfs(, ( << (n + )) - );
printf("%d", res);
} int main() {
freopen("salesman.in", "r", stdin);
freopen("salesman.out", "w", stdout);
init();
solve();
return ;
}

因为关灯不耗时间,所以从一个地方走到另一个地方,从贪心的角度来讲,肯定要把沿路的灯都关掉,因此得到原问题转化成了区间dp。当然还要考虑是从做走到右还是从右走到左,当然可以直接用f[i][j]表示,但是为了防止各种手抽手贱导致半天调不出来,还是加了一维[0/1],表示在从右走到左(0)还是从左走到右。于是方程很容易就出来了,详细的看代码,这里就简单地写了,从f[i][j]转移到f[i - 1][j]或者f[i][j + 1],然后加上路程乘以未被关掉的所有灯的功率。
至于这个功率可以用前缀和先预处理出,接着用总功率减去这一段的功率就行了。
由于开始以为灯的位置不是有序的,特意排了道序,可以无视。
Code
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
typedef bool boolean;
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
#define INF 0xfffffff
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
template<typename T>
inline void readInteger(T& u){
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-');
if(x == '-'){
x = getchar();
aFlag = -;
}
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
u *= aFlag;
} typedef class tower {
public:
int pos;
int w;
int index;
tower(const int pos = , const int w = , const int index = ):pos(pos), w(w), index(index) { } boolean operator < (tower a) const {
return pos < a.pos;
}
}tower; int n, c, rc;
long long f[][][];
tower tows[];
long long sumw[]; inline void init() {
readInteger(n);
readInteger(c);
for(int i = ; i <= n; i++) {
readInteger(tows[i].pos);
readInteger(tows[i].w);
tows[i].index = i;
}
sort(tows + , tows + n + );
sumw[] = ;
for(int i = ; i <= n; i++) {
sumw[i] = sumw[i - ] + tows[i].w;
if(tows[i].index == c) rc = i;
}
} inline void solve() {
memset(f, 0x37, sizeof(f));
f[][rc][rc] = f[][rc][rc] = ;
if(rc > )
f[][rc - ][rc] = (tows[rc].pos - tows[rc - ].pos) * (sumw[n] - tows[rc].w);
if(rc < n)
f[][rc][rc + ] = (tows[rc + ].pos - tows[rc].pos) * (sumw[n] - tows[rc].w);
for(int l = ; l < n; l++) {
for(int i = ; i + l <= n; i++) {
int j = i + l;
if(i > ) {
smin(f[][i - ][j], f[][i][j] + (sumw[n] - (sumw[j] - sumw[i - ])) * (tows[i].pos - tows[i - ].pos));
smin(f[][i - ][j], f[][i][j] + (sumw[n] - (sumw[j] - sumw[i - ])) * (tows[j].pos - tows[i - ].pos));
}
if(j < n) {
smin(f[][i][j + ], f[][i][j] + (sumw[n] - (sumw[j] - sumw[i - ])) * (tows[j + ].pos - tows[j].pos));
smin(f[][i][j + ], f[][i][j] + (sumw[n] - (sumw[j] - sumw[i - ])) * (tows[j + ].pos - tows[i].pos));
}
}
}
long long res = smin(f[][][n], f[][][n]);
printf(AUTO, res);
} int main() {
freopen("power.in", "r", stdin);
freopen("power.out", "w", stdout);
init();
solve();
return ;
}
(题外话)
dp练习 2016.2.24的更多相关文章
- 2016.3.24 OneZero站立会议
会议时间:2016.3.24 15:35-15:55 会议成员:王巍 夏一名 冉华 张敏 会议内容: 1.确立UI界面原形(见http://www.cnblogs.com/zhangminss/p/5 ...
- Murano Weekly Meeting 2016.05.24
Meeting time: 2016.May.24 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: 1.A ...
- 2016.9.24初中部上午NOIP普及组比赛总结
2016.9.24初中部上午NOIP普及组比赛总结 2016.09.24[初中部 NOIP普及组 ]模拟赛 其实这次我没比赛,早上去参加亲子活动去了. 不过在下午我做完了所有的题,感觉还好. 进度 现 ...
- OneZero第四次站立会议(2016.3.24)
会议时间:2016年3月24日 15:30~15:47 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会后修改内容. 会议内容:以下为会议插图 1.界面原型方面,在 ...
- 来自于2016.2.24的flag
今天又做了一套xj模拟题-------打比赛这种事情变得越来越无聊了------既影响自己的计划(虽然看起来很难完成的样子),又扰乱心情.而且题目大都是学习算法之类的,与计划不接轨就非常没有兴趣. 然 ...
- “耐撕”团队 2016.03.24 站立会议
时间: 2016.03.22 17:00-17:30 18:30-19:00 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), ...
- HDU 5745 La Vie en rose (DP||模拟) 2016杭电多校联合第二场
题目:传送门. 这是一道阅读理解题,正解是DP,实际上模拟就能做.pij+1 指的是 (pij)+1不是 pi(j+1),判断能否交换输出即可. #include <iostream> # ...
- 2016 - 1- 21 - RunLoop使用(2016-1-24修改一次)&(2016 - 1 - 24 再次修改)
一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个RunLoop.具体代码如下: 1.通过给RunloopMode里加源来保证RunLoop不直接退出. 这里有个很重要得知识 ...
- 2016/2/24 1,dotctype有几种? 2,了解html的发展历史
1,dotctype有几种?DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本. 其中的DTD(例如上例中的xhtml1-transition ...
随机推荐
- Elasticsearch之settings和mappings的意义
Elasticsearch之settings和mappings(图文详解) Elasticsearch之settings和mappings的意义 简单的说,就是 settings是修改分片和副本数 ...
- 深入理解朴素贝叶斯(Naive Bayes)
https://blog.csdn.net/li8zi8fa/article/details/76176597 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯原理简 ...
- Borg Maze---poj3026最小生成树+bfs
题目链接:http://poj.org/problem?id=3026 题意:可以理解为给你一个地图上面有S和A的表示一个一个的点,#表示墙,所以需要我们用bfs来计算各点之间的距离: b[i][j] ...
- Shell 和Python的区别。
shell 应该属于宏语言,顾名思义是系统的壳,方便与系统交互的在以下情况下,不使用shell,因为shell对此无能为力:如:跨平台,较复杂数学操作(如浮点运算,精确运算等),图形化界面 GUI,I ...
- python 面向对象 析构方法
实例化但从来没有调用他,就浪费了,就应该自动删除它 这个实例一直存在内存里 python有个垃圾自动回收机制 , 每段时间会自动刷新整个内存,把内存垃圾东西删除 析构函数: 在实例释放.销毁的时候 ...
- 008-spring cloud gateway-路由谓词RoutePredicate、RoutePredicateFactory
一.概述 Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping基础结构的一部分进行匹配. Spring Cloud Gateway包含许多内置的 ...
- transition使用
- [py][mx]django注册-邮件激活
人生,学习,就是一段旅途, 说是放弃,其实是自信心作祟. 因为不同时间段状态,譬如晚上和早上刚来状态不一样.做相同事情容器失去自信而放弃. 坚持可以打破这个魔咒 还有就是有些问题得分割, 不要让压死牛 ...
- 问题解决 -------- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题 (2012-09-02 13:09:25) 转载▼ 标签: 杂谈 ...
- df值自由度学习[转载]
转自:https://www.applysquare.com/topic-cn/78TAnIzZ6/ https://zhidao.baidu.com/question/175605082855699 ...