当前位置: 首页 > news >正文

佛山营销网站建设/一个新手怎么做电商

佛山营销网站建设,一个新手怎么做电商,建行个人网上银行登录,建立大型网站吗在 C 算法的奇妙世界里,状态压缩动态规划就像一位神秘的魔法师,它挥舞着二进制的魔杖,将复杂的状态信息压缩成简洁的数字,让看似棘手的问题迎刃而解。今天,就让我们一起走进这位魔法师的世界,学习如何用状态…

在 C++ 算法的奇妙世界里,状态压缩动态规划就像一位神秘的魔法师,它挥舞着二进制的魔杖,将复杂的状态信息压缩成简洁的数字,让看似棘手的问题迎刃而解。今天,就让我们一起走进这位魔法师的世界,学习如何用状态压缩动态规划攻克难题!​

什么是状态压缩动态规划?​

想象你要规划一场盛大的派对,邀请了很多朋友,但朋友们之间有的互相认识,有的互不相识。为了让派对氛围更好,你希望邀请的朋友尽可能多,同时保证任意两个被邀请的朋友都互相认识。这个问题中,每个朋友是否被邀请就是一个状态,而所有朋友的邀请状态组合起来就是一个复杂的整体状态。状态压缩动态规划就是把这样复杂的状态,通过二进制等方式压缩成一个数,从而简化问题的求解过程 。​

它的核心在于将离散的、多维的状态用一个整数表示,利用位运算高效地处理状态之间的转移,在解决涉及集合、子集等问题时,有着独特的优势。​

状态压缩动态规划的关键要素​

  1. 状态定义:把问题中的各种状态用一个整数表示,例如用二进制位表示某个元素是否被选取、某个条件是否满足等。​
  1. 状态转移方程:根据问题的逻辑,确定如何从一个压缩后的状态转移到另一个状态,通常会借助位运算实现。​
  1. 边界条件:设定初始状态,为后续的状态转移提供起点。​

代码实现与详细解释​

我们以 “旅行商问题(TSP)” 的简化版本为例,来看看状态压缩动态规划的实际应用。​

问题描述​

假设有 n 个城市,城市之间有距离。一个旅行商需要从某个城市出发,经过每个城市恰好一次,最后回到出发城市,求最短的旅行距离。为了简化,我们假设这是一个无向完全图,即任意两个城市之间都有直接相连的路径。​

代码示例​

#include <iostream>
#include <vector>
#include <limits>
using namespace std;// 计算旅行商问题的最短路径
int tsp(vector<vector<int>>& distance) {int n = distance.size();// dp[i][j]表示状态为i,当前位于城市j时的最短路径长度// i的二进制表示中,第k位为1表示城市k已经被访问过vector<vector<int>> dp(1 << n, vector<int>(n, numeric_limits<int>::max()));// 初始状态:从城市0出发,已经访问过城市0dp[1][0] = 0;for (int state = 1; state < (1 << n); ++state) {for (int j = 0; j < n; ++j) {if (dp[state][j] != numeric_limits<int>::max()) {for (int k = 0; k < n; ++k) {if (!(state & (1 << k))) {  // 城市k还未被访问int newState = state | (1 << k);  // 更新状态,标记城市k已访问dp[newState][k] = min(dp[newState][k], dp[state][j] + distance[j][k]);}}}}}// 回到起点0,找到最短路径int minDistance = numeric_limits<int>::max();for (int i = 0; i < n; ++i) {minDistance = min(minDistance, dp[(1 << n) - 1][i] + distance[i][0]);}return minDistance;
}

代码解释​

  1. 首先定义了二维数组 dp ,dp[i][j] 表示状态为 i ,当前位于城市 j 时的最短路径长度。其中 i 是一个整数,它的二进制表示中,第 k 位为 1 表示城市 k 已经被访问过。例如,1 的二进制是 0001 ,表示只访问了城市 0 ;3 的二进制是 0011 ,表示访问了城市 0 和城市 1 。​
  1. 初始化 dp[1][0] = 0 ,表示从城市 0 出发,且已经访问过城市 0 时,路径长度为 0 。​
  1. 外层循环遍历所有可能的状态 state ,内层循环遍历当前状态下的所有城市 j 。当 dp[state][j] 不是无穷大时,说明存在从起始状态到当前状态且位于城市 j 的路径。​
  1. 最内层循环遍历所有城市 k ,如果城市 k 还未被访问(通过位运算 !(state & (1 << k)) 判断),则更新状态 newState ,将城市 k 标记为已访问,并更新 dp[newState][k] 为更短的路径长度。​
  1. 最后,遍历所有城市 i ,计算回到起点 0 的最短路径长度,返回结果。​

进阶例题:方格取数问题​

问题描述​

在一个 n×n 的方格中,每个方格都有一个整数。现在需要从左上角走到右下角,每次只能向下或向右走,并且走过的方格中的数字会被取走(不能再取)。求能取到的数字和的最大值。同时,在取数过程中,有些方格是不能经过的。​

代码示例​

#include <iostream>
#include <vector>
using namespace std;// 方格取数问题
int maxSum(vector<vector<int>>& grid) {int n = grid.size();// dp[i][j][state]表示走到(i, j)位置,状态为state时的最大数字和// state的二进制表示中,第k位为1表示(0, k)到(i, k)这一列已经被访问过vector<vector<vector<int>>> dp(n, vector<vector<int>>(n, vector<int>(1 << n, 0)));if (grid[0][0] == -1) return 0;  // 起点不能走dp[0][0][1] = grid[0][0];for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] != -1) {if (i > 0) {for (int state = 0; state < (1 << n); ++state) {dp[i][j][state | (1 << j)] = max(dp[i][j][state | (1 << j)], dp[i - 1][j][state] + grid[i][j]);}}if (j > 0) {for (int state = 0; state < (1 << n); ++state) {dp[i][j][state] = max(dp[i][j][state], dp[i][j - 1][state] + grid[i][j]);}}}}}return dp[n - 1][n - 1][(1 << n) - 1];
}

代码解释​

  1. 定义三维数组 dp[i][j][state] ,表示走到 (i, j) 位置,状态为 state 时的最大数字和。其中 state 的二进制表示中,第 k 位为 1 表示 (0, k) 到 (i, k) 这一列已经被访问过。​
  1. 初始化 dp[0][0][1] ,如果起点 (0, 0) 不是不能走的方格(值不为 -1 ),则将其赋值为该方格的数字。​
  1. 通过两层循环遍历方格的每一个位置 (i, j) ,如果该位置可以走(grid[i][j] != -1 ),则分别处理从上边和左边走过来的情况:​
  • 从上边过来时,更新状态,将当前列标记为已访问,并更新 dp 值。​
  • 从左边过来时,不改变状态,直接更新 dp 值。​
  1. 最后返回右下角位置 (n - 1, n - 1) ,状态为所有列都已访问((1 << n) - 1 )时的最大数字和。​

状态压缩动态规划就像一把精巧的钥匙,能打开许多复杂问题的大门。只要掌握了它的核心思想和技巧,再结合实际问题灵活运用,就能在算法的世界里披荆斩棘。快来尝试用它解决更多有趣的问题,开启你的算法冒险之旅吧!​

http://www.whsansanxincailiao.cn/news/32003616.html

相关文章:

  • 网站建设是干什么/郑州seo外包阿亮
  • 武汉建筑企业排名/网站seo优化方案策划书
  • 建设外贸网站费用/西地那非
  • 建设工程查询市场价网站/今日百度小说排行榜风云榜
  • 泰安网站建设工作室/厦门人才网唯一官方网站
  • 武汉做网站好的公司/太原百度关键词排名
  • wordpress widgets_init/宁波seo优化外包公司
  • 为什么做的网站搜不出来的/成都seo专家
  • 广西做网站的公司有哪些/cilimao磁力猫最新版地址
  • 做淘宝内部优惠券网站要钱么/谷歌seo运营
  • 外贸公司的网站怎么做/企业网站推广的方法
  • 网站域名后缀有什么用/互联网营销师是做什么的
  • 佛山市手机网站建设/班级优化大师app
  • 广昌网站建设/最近一周新闻大事摘抄
  • 织梦网站404怎么做/做运营的具体做什么
  • 站酷网站的图是用什么做的/万网注册域名
  • 新闻类网站怎么做seo/东莞百度推广优化排名
  • 可信网站身份验证 必须做吗/深圳市社会组织总会
  • 做网站到底能不能赚钱/营销的三个基本概念是什么
  • 深圳做网站排名哪家好/常见的网络营销工具
  • 做网站分辨率多少钱/网店代运营收费
  • 浙江建设集团/梁水才seo优化专家
  • 个人网站建站目的/优化网站的目的
  • 网站开发有前途吗/微信小程序怎么做
  • 爱做奈官方网站/软文推广网站
  • wordpress网站logo没显示/百度一下全知道
  • 怎么通过微博做网站外链/新浪微博指数查询
  • 门户网站区别/百度手机助手免费下载
  • 郑州网站建设品牌好/我们公司想做网络推广
  • 怎样接做网站的活/seo什么职位