很经典的一道状压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的更多相关文章

  1. 2016.3.24 OneZero站立会议

    会议时间:2016.3.24 15:35-15:55 会议成员:王巍 夏一名 冉华 张敏 会议内容: 1.确立UI界面原形(见http://www.cnblogs.com/zhangminss/p/5 ...

  2. Murano Weekly Meeting 2016.05.24

    Meeting time: 2016.May.24 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1.A ...

  3. 2016.9.24初中部上午NOIP普及组比赛总结

    2016.9.24初中部上午NOIP普及组比赛总结 2016.09.24[初中部 NOIP普及组 ]模拟赛 其实这次我没比赛,早上去参加亲子活动去了. 不过在下午我做完了所有的题,感觉还好. 进度 现 ...

  4. OneZero第四次站立会议(2016.3.24)

    会议时间:2016年3月24日 15:30~15:47 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会后修改内容. 会议内容:以下为会议插图 1.界面原型方面,在 ...

  5. 来自于2016.2.24的flag

    今天又做了一套xj模拟题-------打比赛这种事情变得越来越无聊了------既影响自己的计划(虽然看起来很难完成的样子),又扰乱心情.而且题目大都是学习算法之类的,与计划不接轨就非常没有兴趣. 然 ...

  6. “耐撕”团队 2016.03.24 站立会议

    时间: 2016.03.22  17:00-17:30     18:30-19:00 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), ...

  7. HDU 5745 La Vie en rose (DP||模拟) 2016杭电多校联合第二场

    题目:传送门. 这是一道阅读理解题,正解是DP,实际上模拟就能做.pij+1 指的是 (pij)+1不是 pi(j+1),判断能否交换输出即可. #include <iostream> # ...

  8. 2016 - 1- 21 - RunLoop使用(2016-1-24修改一次)&(2016 - 1 - 24 再次修改)

    一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个RunLoop.具体代码如下:    1.通过给RunloopMode里加源来保证RunLoop不直接退出. 这里有个很重要得知识 ...

  9. 2016/2/24 1,dotctype有几种? 2,了解html的发展历史

    1,dotctype有几种?DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本. 其中的DTD(例如上例中的xhtml1-transition ...

随机推荐

  1. Oracle安装部署之rhel 5.8下静默安装oracle11gr2

    1.图形界面下录制脚本如下: #-------------------------------------------------------------------------------# Do ...

  2. 3322.org

    3322.org — Krebs on Security https://krebsonsecurity.com/tag/3322-org/

  3. iOS多线程编程之NSOperation的基本操作(转载)

    一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperat ...

  4. UIWebview于JS交互

    最近使用火车票网的限行网页,但是广告以及头部nav和地步footer都是我们现在所不需要的,所以决定使用js交互,下面所有代码都写在 webViewDidFinishLoad 里面 1.查看原网址的源 ...

  5. spring boot上传 下载图片。

    https://blog.csdn.net/a625013/article/details/52414470 build.gradle buildscript { repositories { mav ...

  6. 使用gradle构建多模块springboot项目,打jar包

    官方文档: https://spring.io/guides/gs/rest-service/  参考:http://blog.csdn.net/u013360850/article/details/ ...

  7. Spark DataFrame vector 类型存储到Hive表

    1. 软件版本 软件 版本 Spark 1.6.0 Hive 1.2.1 2. 场景描述 在使用Spark时,有时需要存储DataFrame数据到Hive表中,一般的存储方式如下: // 注册临时表 ...

  8. (转载)【cocos2dx 3.x Lua] 注册事件函数详解

    出处: http://www.2cto.com/kf/201409/338235.html coocs2dx 版本 3.1.1 registerScriptTouchHandler 注册触屏事件 re ...

  9. android studio 错误: 编码GBK的不可映射字符

    在模块的build.gradle中加入: tasks.withType(JavaCompile) { options.encoding = "UTF-8" } JavaCompil ...

  10. android studio 3.0 安装配置

    1.  安装jdk1.8 2.复制android sdk  设置代理  mirrors.neusoft.edu.cn  端口 80 http代理  更新sdk  安装  android support ...