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 ...
随机推荐
- element 表格元素 超链接
1.在循环体中的事件绑定 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- thread safe
computer science J. Glenn Brookshear with contributions from David T. SmithIndiana University of Pen ...
- cas sso原理
以下转载至https://blog.csdn.net/javaloveiphone/article/details/52439613 从结构上看,CAS包含两个部分:CAS Server 和CAS C ...
- 【linux set命令】shell bash 打印执行的命令
在文件开头加上 set -x 可以打印执行的命令,可以用于调试 set 命令使用方法 https://www.jianshu.com/p/ea406382be3e
- csv文件的读写
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. "&quo ...
- visio 的使用方法
1:往visio中添加商务图形和形状的方法.例如饼状图. 文件>形状>商务>图表和图形>绘制图表形状 2:visio 画半弧形,用铅笔 3: visio 画的图形,如果想要和v ...
- SQLserver数据库连接问题
可能安装好之后数据库的端口1433被防火墙拦截了,查看端口是否在监听当中: 在cmd里输入命令 :netstat -an 查看是否处在监听中,如果没有进入下面的设置, C:\Windows\SysWO ...
- 识别真假搜索引擎(搜索蜘蛛)方法(baidu,google,Msn,sogou,soso等)
http://www.useragentstring.com/pages/useragentstring.php 今天分析研究了两个网站的 Apache 日志,分析日志虽然很无聊,但却是很有意义的事情 ...
- PHP 自定义header 参数获取的问题
有的情况下,我们需要把参数放在Headers 里传递.比如说与提供给移动端的api,不能进行缓存的时候. 但是,自定义的header 经常是拿不到的. 如果是apache 的服务器,可以用 apach ...
- WPF学习笔记-用Expression Design制作矢量图然后导出为XAML
WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...