连接:http://bailian.openjudge.cn/practice/4124

题意:从1到n走过所有点恰好一次最短时间。乱搞的话会完美的超时(阶乘级别的复杂度,虽然范围很小,但是也足够超时了)。

思路:先想一个不太成熟的思路。用dp[j][s]表示。s记录的是每个点是否被走过的状态。而dp[s][j]表示的是从1走到j状态所用的最小时间。这样的思路成不成立呢?首先,考虑初始值。开始是在1号点,那么dp[1][1]自然就是0了,其他就是max;另外,题面说只要遍历每一个点,而于顺序的话,并没有要求,也就是说,通过任何一种演变方式到达该状态的方式都是等价的,满足了动态规划无后效性的要求。同时,对于每一个时刻,当前位置存储的值都是当前最优解,既问题具有最优子结构性质。同时,对于每一个演变,我们可以在dp[s][j]的基础上,推出当前状态的值可以通过上一步演变就到达的状态进行更新,这也就是所谓“人人为我”的过程。dp方程也好想,既:

dp[i][k] = min(dp[i][k],dp[i_pre][k_pre]+G[i_pre][i]);

接下来就是比较重要的问题了:如何表示这些状态,以及进行状态之间的计算呢?

用16个bool?太麻烦了!换一种思路:因为只有16个数,将他们编成二进制编码101010101010100……每一位代表当前位置所代表的点是否被走过,这样的话,只需要2^16个无符号shortint(实际用int)就可以表示所有可能的状态啦。

第一个问题是解决了,可如何进行状态间的变换呢?请把c语言程序设计翻到xxx页,有关位运算的章节:

&, 这个东西叫按位与,既每一位依次比较一样就是1,不一样就是0。平时常用的判断奇偶性的n&1就是最简单的应用。

|,这东西叫按位或,键位有点怪,一般在enter附近,意思是每一位依次比较有1就是1,全0就是0

^,按位异或,也是中文输入法下省略号的打法。官方的话是相同为0,不同为1,我的理解就是不带进位的加法。

~,取反,在tab上面,int下的话就是~x = -x-1 最常用的那个while(~scanf)用的就是这个原理(~0 = -0-1 = -1 = EOF)。

<< >> 左移右移 不多说,乘2除2

一些比较清奇的用法

从低位到高位,取n的第m位

return (n >> (m-1)) & 1;
从低位到高位.将n的第m位置1
return n | (1 << (m-1));
从低位到高位,将n的第m位置0

return n & ~(1 << (m-1));

(x&-x)只保留最低位的1

具体用法的话读代码,体会一下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;void read(){
#ifndef ONLINE_JUDGEfreopen("D:\\fengyu\\Jiang_C\\.vscode\\in.txt","r",stdin);freopen("D:\\fengyu\\Jiang_C\\.vscode\\out.txt","w",stdout);
#endif
}
int G[20][20];
int dp[20][(1<<16)+5];
int main() { read();int n;while (cin >> n) {memset(dp,0x3f,sizeof(dp));for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cin >> G[i][j];}}dp[1][1] = 0;int ans = (1<<n)-1;for (int k = 1; k <= ans; k++) {for (int i = 1,_i = 1; i <= n; i++,_i<<=1) {if (k&_i)for (int j = 1, _j = 1; j <= n; j++,_j<<=1) {if (i!=j && k&_j)dp[i][k] = min(dp[i][k],dp[j][k^_i]+G[j][i]);}}}cout << dp[n][ans] << endl;}return 0;
}

转载于:https://www.cnblogs.com/fengyuzhicheng/p/9153254.html

源哥每日一题第十三弹 百练4124:海贼王之伟大航路 状压dp相关推荐

  1. 源哥每日一题第十七弹 poj 1568 Alpha-Beta剪枝

    链接:http://poj.org/problem?id=1568 题目:为什么是英文啊题目就是给你一个4*4的OX棋盘,上面已经下了一些棋,然后现在轮到X下,问你有没有一个必胜的方法,有的话就输出坐 ...

  2. 源哥每日一题第一弹 codeforces 913 C. Party Lemonade

    题目连接:http://codeforces.com/problemset/problem/913/C 题意:n个物品 ,第i个物品的体积是2^i-1 花费是ci 每种物品无限使用 问取物品总体积大于 ...

  3. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  4. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧-- Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...

  5. Orz_panda cup I题 (xdoj1117) 状压dp

    Orz_panda cup I题 (xdoj1117)  状压dp 1117: Insert Orz Pandas 时间限制: 2 Sec  内存限制: 128 MB 提交: 15  解决: 5 [提 ...

  6. 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc

    糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述]    ...

  7. agc012E Camel and Oases(状压dp+思路题)

    这题神啊.状压dp你敢信?思维难度爆表还有一堆细节要注意???orz Visjiao 原题链接:http://agc012.contest.atcoder.jp/tasks/agc012_e 大神题解 ...

  8. [状压dp] 蒙德里安的梦想(模板题+状压dp)

    文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...

  9. [状压dp] 最短Hamilton路径(模板题+状压dp)

    文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...

最新文章

  1. 深度学习融入博弈论的方法会迸发出哪些新思路呢?
  2. 在java的实现栈的插入数据_Java实现数据结构栈stack和队列Queue
  3. [Part 3]API对接,这些坑你一定掉过!
  4. 本文将向您展示如何在 Flutter 中编码/解码 JSON
  5. jUnit生命周期管理学习
  6. 【开源项目】基于Directx屏幕录制
  7. am335x reboot 命令分析
  8. matlab 建立ctruct,扩频通信系统及MATLAB仿真1
  9. MySQL查看当前的连接信息
  10. 水培设备行业调研报告 - 市场现状分析与发展前景预测
  11. eclipse新建java项目_用eclipse创建Java项目(以一个初学者的角度全面教学)
  12. 精细运营,这只“蚂蚁”开辟了一条全新的财富之路
  13. 通达信版弘历软件指标_弘历软件多空王指标
  14. 5G到底什么时候来,以及,它究竟能给我们带来什么?
  15. 用程序实现基本计算器功能
  16. 有赞实时计算 Flink 1.13 升级实践
  17. 23-基于51单片机土壤湿度检测及自动浇花系统(带时间显示)
  18. 【CVPR2020】Detection in Crowded Scenes: One Proposal, Multiple Predictions笔记
  19. 中电药明招募资深Python开发工程师
  20. 解决iphone4无法格式化号码的问题

热门文章

  1. 关于ionic的一些坑(3)
  2. ORACLE 服务名简述及配置说明
  3. C# 获取Excel版本
  4. Linux popen和pclose启动shell命令的问题思考
  5. android studio 反编译工具,android studio反编译工具jd-inteIIij
  6. python拷贝文件夹目录和文件_Python 拷贝文件及文件夹到远程主机目录
  7. linux 查看入侵日志,linux入侵日志记录清除
  8. python实现监控增量_Python 快速计算增量的方法
  9. 二叉树遍历(已知先序和中序)
  10. Seata 1.4.0 重磅发布