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

备案 几个网站网站建设尺寸

备案 几个网站,网站建设尺寸,界面设计心得,电子政务网站建设方案1.动态规划理论基础 动态规划刷题大纲 什么是动态规划 动态规划#xff0c;英文#xff1a;Dynamic Programming#xff0c;简称DP#xff0c;如果某一问题有很多重叠子问题#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的…1.动态规划理论基础 动态规划刷题大纲 什么是动态规划 动态规划英文Dynamic Programming简称DP如果某一问题有很多重叠子问题使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的这一点就区分于贪心贪心没有状态推导而是从局部直接选最优的 在关于贪心算法你该了解这些 (opens new window)中我举了一个背包问题的例子。 例如有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]得到的价值是value[i] 。每件物品只能用一次求解将哪些物品装入背包里物品价值总和最大。 动态规划中dp[j]是由dp[j-weight[i]]推导出来的然后取max(dp[j], dp[j - weight[i]] value[i])。 但如果是贪心呢每次拿物品选一个最大的或者最小的就完事了和上一个状态没有关系。 所以贪心解决不了动态规划的问题。 其实大家也不用死扣动规和贪心的理论区别后面做做题目自然就知道了。 而且很多讲解动态规划的文章都会讲最优子结构啊和重叠子问题啊这些这些东西都是教科书的上定义晦涩难懂而且不实用。 大家知道动规是由前一个状态推导出来的而贪心是局部直接选最优的对于刷题来说就够用了。 上述提到的背包问题后序会详细讲解。 动态规划的解题步骤 做动规题目的时候很多同学会陷入一个误区就是以为把状态转移公式背下来照葫芦画瓢改改就开始写代码甚至把题目AC之后都不太清楚dp[i]表示的是什么。 这就是一种朦胧的状态然后就把题给过了遇到稍稍难一点的可能直接就不会了然后看题解然后继续照葫芦画瓢陷入这种恶性循环中。 状态转移公式递推公式是很重要但动规不仅仅只有递推公式。 对于动态规划问题我将拆解为如下五步曲这五步都搞清楚了才能说把动态规划真的掌握了 确定dp数组dp table以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 一些同学可能想为什么要先确定递推公式然后在考虑初始化呢 因为一些情况是递推公式决定了dp数组要如何初始化 后面的讲解中我都是围绕着这五点来进行讲解。 可能刷过动态规划题目的同学可能都知道递推公式的重要性感觉确定了递推公式这道题目就解出来了。 其实 确定递推公式 仅仅是解题里的一步而已 一些同学知道递推公式但搞不清楚dp数组应该如何初始化或者正确的遍历顺序以至于记下来公式但写的程序怎么改都通过不了。 后序的讲解的大家就会慢慢感受到这五步的重要性了。 动态规划应该如何debug 相信动规的题目很大部分同学都是这样做的。 看一下题解感觉看懂了然后照葫芦画瓢如果能正好画对了万事大吉一旦要是没通过就怎么改都通过不了对 dp数组的初始化递推公式遍历顺序处于一种黑盒的理解状态。 写动规题目代码出问题很正常 找问题的最好方式就是把dp数组打印出来看看究竟是不是按照自己思路推导的 一些同学对于dp的学习是黑盒的状态就是不清楚dp数组的含义不懂为什么这么初始化递推公式背下来了遍历顺序靠习惯就是这么写的然后一鼓作气写出代码如果代码能通过万事大吉通过不了的话就凭感觉改一改。 这是一个很不好的习惯 做动规的题目写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍心中有数确定最后推出的是想要的结果。 然后再写代码如果代码没通过就打印dp数组看看是不是和自己预先推导的哪里不一样。 如果打印出来和自己预先模拟推导是一样的那么就是自己的递归公式、初始化或者遍历顺序有问题了。 如果和自己预先模拟推导的不一样那么就是代码实现细节有问题。 这样才是一个完整的思考过程而不是一旦代码出问题就毫无头绪的东改改西改改最后过不了或者说是稀里糊涂的过了。 这也是我为什么在动规五步曲里强调推导dp数组的重要性。 举个例子哈在「代码随想录」刷题小分队微信群里一些录友可能代码通过不了会把代码抛到讨论群里问我这里代码都已经和题解一模一样了为什么通过不了呢 发出这样的问题之前其实可以自己先思考这三个问题 这道题目我举例推导状态转移公式了么我打印dp数组的日志了么打印出来了dp数组和我想的一样么 如果这灵魂三问自己都做到了基本上这道题目也就解决了或者更清晰的知道自己究竟是哪一点不明白是状态转移不明白还是实现代码不知道该怎么写还是不理解遍历dp数组的顺序。 总结 这一篇是动态规划的整体概述讲解了什么是动态规划动态规划的解题步骤以及如何debug。 动态规划是一个很大的领域今天这一篇讲解的内容是整个动态规划系列中都会使用到的一些理论基础。 2.斐波那契数 力扣题目链接(opens new window) 斐波那契数通常用 F(n) 表示形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始后面的每一项数字都是前面两项数字的和。也就是 F(0) 0F(1)  1 F(n) F(n - 1) F(n - 2)其中 n 1 给你n 请计算 F(n) 。 示例 1 输入2输出1解释F(2) F(1) F(0) 1 0 1 示例 2 输入3输出2解释F(3) F(2) F(1) 1 1 2 示例 3 输入4输出3解释F(4) F(3) F(2) 2 1 3 提示 0 n 30 思路 斐波那契数列大家应该非常熟悉不过了非常适合作为动规第一道题目来练练手。 因为这道题目比较简单可能一些同学并不需要做什么分析直接顺手一写就过了。 但「代码随想录」的风格是简单题目是用来加深对解题方法论的理解的。 通过这道题目让大家可以初步认识到按照动规五部曲是如何解题的。 对于动规如果没有方法论的话可能简单题目可以顺手一写就过难一点就不知道如何下手了。 所以我总结的动规五部曲是要用来贯穿整个动态规划系列的就像之前讲过二叉树系列的递归三部曲 (opens new window)回溯法系列的回溯三部曲 (opens new window)一样。后面慢慢大家就会体会到动规五部曲方法的重要性。 动态规划 动规五部曲 这里我们要用一个一维dp数组来保存递归的结果 确定dp数组以及下标的含义 dp[i]的定义为第i个数的斐波那契数值是dp[i] 确定递推公式 为什么这是一道非常简单的入门题目呢 因为题目已经把递推公式直接给我们了状态转移方程 dp[i] dp[i - 1] dp[i - 2]; dp数组如何初始化 确定遍历顺序 从递归公式dp[i] dp[i - 1] dp[i - 2];中可以看出dp[i]是依赖 dp[i - 1] 和 dp[i - 2]那么遍历的顺序一定是从前到后遍历的 举例推导dp数组 按照这个递推公式dp[i] dp[i - 1] dp[i - 2]我们来推导一下当N为10的时候dp数组应该是如下的数列 0 1 1 2 3 5 8 13 21 34 55 如果代码写出来发现结果不对就把dp数组打印出来看看和我们推导的数列是不是一致的。 递归解法 本题还可以使用递归解法来做 这个递归的时间复杂度大家画一下树形图就知道了如果不清晰的同学可以看这篇通过一道面试题目讲一讲递归算法的时间复杂度(opens new window) 总结 斐波那契数列这道题目是非常基础的题目我在后面的动态规划的讲解中将会多次提到斐波那契数列 这里我严格按照关于动态规划你该了解这些 (opens new window)中的动规五部曲来分析了这道题目一些分析步骤可能同学感觉没有必要搞的这么复杂代码其实上来就可以撸出来。 public class Fibonacci_number {public int fib1(int n) {if (n 2) return n;//如果 n 小于 2直接返回 n因为斐波那契数列的前两个数分别是 0 和 1。int a 0, b 1, c 0;//a、b 和 c分别代表当前数列的前两个数和它们的和。初始时a 0b 1c 0。for (int i 1; i n; i) {//从 1 迭代到 n - 1每次迭代计算下一个斐波那契数更新 a 和 b 的值。c a b;a b;b c;}return c;//最终返回 c即第 n 个斐波那契数。}}时间复杂度O(n) 空间复杂度O(1) public class Fibonacci_number {public int fib2(int n) {if (n 1) return n;//如果 n 小于或等于 1直接返回 n因为斐波那契数列的前两个数分别是 0 和 1。int[] dp new int[n 1];//创建一个长度为 n 1 的数组 dp为了存储从 F(0) 到 F(n) 的所有斐波那契数。用于存储斐波那契数列的每个数。dp[0] 0;dp[1] 1;for (int index 2; index n; index){//从 2 迭代到 n每次迭代计算下一个斐波那契数并存储在 dp[index] 中。dp[index] dp[index - 1] dp[index - 2];}return dp[n];} }时间复杂度O(n) 空间复杂度O(n) 3.爬楼梯 力扣题目链接(opens new window) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢 注意给定 n 是一个正整数。 示例 1 输入 2输出 2解释 有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2 输入 3输出 3解释 有三种方法可以爬到楼顶。 1 阶 1 阶 1 阶1 阶 2 阶2 阶 1 阶 思路 爬到第一层楼梯有一种方法爬到二层楼梯有两种方法。 那么第一层楼梯再跨两步就到第三层 第二层楼梯再跨一步就到第三层。 所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来那么就可以想到动态规划了。 我们来分析一下动规五部曲 定义一个一维数组来记录不同楼层的状态 确定dp数组以及下标的含义 dp[i] 爬到第i层楼梯有dp[i]种方法 确定递推公式 如何可以推出dp[i]呢 从dp[i]的定义可以看出dp[i] 可以有两个方向推出来。 首先是dp[i - 1]上i-1层楼梯有dp[i - 1]种方法那么再一步跳一个台阶不就是dp[i]了么。 还有就是dp[i - 2]上i-2层楼梯有dp[i - 2]种方法那么再一步跳两个台阶不就是dp[i]了么。 那么dp[i]就是 dp[i - 1]与dp[i - 2]之和 所以dp[i] dp[i - 1] dp[i - 2] 。 在推导dp[i]的时候一定要时刻想着dp[i]的定义否则容易跑偏。 这体现出确定dp数组以及下标的含义的重要性 dp数组如何初始化 再回顾一下dp[i]的定义爬到第i层楼梯有dp[i]种方法。 那么i为0dp[i]应该是多少呢这个可以有很多解释但基本都是直接奔着答案去解释的。 例如强行安慰自己爬到第0层也有一种方法什么都不做也就是一种方法即dp[0] 1相当于直接站在楼顶。 但总有点牵强的成分。 那还这么理解呢我就认为跑到第0层方法就是0啊一步只能走一个台阶或者两个台阶然而楼层是0直接站楼顶上了就是不用方法dp[0]就应该是0. 其实这么争论下去没有意义大部分解释说dp[0]应该为1的理由其实是因为dp[0]1的话在递推的过程中i从2开始遍历本题就能过然后就往结果上靠去解释dp[0] 1。 从dp数组定义的角度上来说dp[0] 0 也能说得通。 需要注意的是题目中说了n是一个正整数题目根本就没说n有为0的情况。 所以本题其实就不应该讨论dp[0]的初始化 我相信dp[1] 1dp[2] 2这个初始化大家应该都没有争议的。 所以我的原则是不考虑dp[0]如何初始化只初始化dp[1] 1dp[2] 2然后从i 3开始递推这样才符合dp[i]的定义。 确定遍历顺序 从递推公式dp[i] dp[i - 1] dp[i - 2];中可以看出遍历顺序一定是从前向后遍历的 举例推导dp数组 举例当n为5的时候dp tabledp数组应该是这样的 如果代码出问题了就把dp table 打印出来看看究竟是不是和自己推导的一样。 此时大家应该发现了这不就是斐波那契数列么 唯一的区别是没有讨论dp[0]应该是什么因为dp[0]在本题没有意义 拓展 这道题目还可以继续深化就是一步一个台阶两个台阶三个台阶直到 m个台阶有多少种方法爬到n阶楼顶。 这又有难度了这其实是一个完全背包问题但力扣上没有这种题目大家可以去卡码网去做一下 57. 爬楼梯(opens new window) 所以后续我在讲解背包问题的时候今天这道题还会从背包问题的角度上来再讲一遍。 如果想提前看一下可以看这篇:70.爬楼梯完全背包版本 一个绝佳的大厂面试题第一道题就是单纯的爬楼梯然后看候选人的代码实现如果把dp[0]的定义成1了就可以发难了为什么dp[0]一定要初始化为1此时可能候选人就要强行给dp[0]应该是1找各种理由。那这就是一个考察点了对dp[i]的定义理解的不深入。 然后可以继续发难如果一步一个台阶两个台阶三个台阶直到 m个台阶有多少种方法爬到n阶楼顶。这道题目leetcode上并没有原题绝对是考察候选人算法能力的绝佳好题。 这一连套问下来候选人算法能力如何面试官心里就有数了。 其实大厂面试最喜欢的问题就是这种简单题然后慢慢变化在小细节上考察候选人。 总结 这道题目和动态规划斐波那契数 (opens new window)题目基本是一样的但是会发现本题相比动态规划斐波那契数 (opens new window)难多了为什么呢 关键是 动态规划斐波那契数 (opens new window)题目描述就已经把动规五部曲里的递归公式和如何初始化都给出来了剩下几部曲也自然而然的推出来了。 而本题就需要逐个分析了大家现在应该初步感受出关于动态规划你该了解这些 (opens new window)里给出的动规五部曲了。 简单题是用来掌握方法论的例如昨天斐波那契的题目够简单了吧但昨天和今天可以使用一套方法分析出来的这就是方法论 public class Climbing_Stairs {public int climbStairs1(int n) {int[] dp new int[n 1];//创建一个长度为 n 1 的数组 dp用于存储从第0个台阶到第 n 个台阶的爬法数量。dp[0] 1;//表示在地面上第0个台阶只有1种方式啥都不做。dp[1] 1;//表示到达第1个台阶只有1种方式即向上爬1个台阶。for (int i 2; i n; i) {//从2迭代到 n每次迭代计算到达当前台阶的不同方法数并存储在 dp[i] 中。到达第 i 个台阶的方法数等于到达第 i-1 个台阶的方法数加上到达第 i-2 个台阶的方法数因为可以从第 i-1 个台阶走1步上来或者从第 i-2 个台阶走2步上来。dp[i] dp[i - 1] dp[i - 2];}return dp[n];}}时间复杂度O(n)  空间复杂度O(n) public class Climbing_Stairs {public int climbStairs2(int n) {if(n 2) return n;//如果 n 小于或等于2直接返回 n因为对于前两个台阶爬法数量就是台阶数。int a 1, b 2, sum 0;// a、b 和 sum分别代表当前数列的前两个数和它们的和。初始时a 1第1个台阶的爬法数b 2第2个台阶的爬法数sum 0。for(int i 3; i n; i){//从3迭代到 n每次迭代计算下一个台阶的爬法数并更新 a 和 b 的值。sum 保存当前台阶的爬法数a 更新为 b 的值b 更新为 sum 的值。sum a b;a b;b sum;}return b;} }时间复杂度O(n)  空间复杂度O(1) 4.使用最小花费爬楼梯 力扣题目链接(opens new window) 旧题目描述 数组的每个下标作为一个阶梯第 i 个阶梯对应着一个非负数的体力花费值 cost[i]下标从 0 开始。 每当你爬上一个阶梯你都要花费对应的体力值一旦支付了相应的体力值你就可以选择向上爬一个阶梯或者爬两个阶梯。 请你找出达到楼层顶部的最低花费。在开始时你可以选择从下标为 0 或 1 的元素作为初始阶梯。 示例 1 输入cost [10, 15, 20]输出15解释最低花费是从 cost[1] 开始然后走两步即可到阶梯顶一共花费 15 。 示例 2 输入cost [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]输出6解释最低花费方式是从 cost[0] 开始逐个经过那些 1 跳过 cost[3] 一共花费 6 。 提示 cost 的长度范围是 [2, 1000]。cost[i] 将会是一个整型数据范围为 [0, 999] 。 本题之前的题目描述是很模糊的看不出来第一步需要花费体力值最后一步不用花费还是说 第一步不花费体力值最后一步花费。 后来力扣改了题目描述新题目描述 给你一个整数数组 cost 其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 思路 在力扣修改了题目描述下我又重新修改了题解 修改之后的题意就比较明确了题目中说 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯” 也就是相当于 跳到 下标 0 或者 下标 1 是不花费体力的 从 下标 0 下标1 开始跳就要花费体力了。 确定dp数组以及下标的含义 使用动态规划就要有一个数组来记录状态本题只需要一个一维数组dp[i]就可以了。 dp[i]的定义到达第i台阶所花费的最少体力为dp[i]。 对于dp数组的定义大家一定要清晰 确定递推公式 可以有两个途径得到dp[i]一个是dp[i-1] 一个是dp[i-2]。 dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] cost[i - 1]。 dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] cost[i - 2]。 那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢 一定是选最小的所以dp[i] min(dp[i - 1] cost[i - 1], dp[i - 2] cost[i - 2]); dp数组如何初始化 看一下递归公式dp[i]由dp[i - 1]dp[i - 2]推出既然初始化所有的dp[i]是不可能的那么只初始化dp[0]和dp[1]就够了其他的最终都是dp[0]dp[1]推出。 那么 dp[0] 应该是多少呢 根据dp数组的定义到达第0台阶所花费的最小体力为dp[0]那么有同学可能想那dp[0] 应该是 cost[0]例如 cost [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话dp[0] 就是 cost[0] 应该是1。 这里就要说明本题力扣为什么改题意而且修改题意之后 就清晰很多的原因了。 新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 到达 第 0 个台阶是不花费的但从 第0 个台阶 往上跳的话需要花费 cost[0]。 所以初始化 dp[0] 0dp[1] 0; 确定遍历顺序 最后一步递归公式有了初始化有了如何遍历呢 本题的遍历顺序其实比较简单简单到很多同学都忽略了思考这一步直接就把代码写出来了。 因为是模拟台阶而且dp[i]由dp[i-1]dp[i-2]推出所以是从前到后遍历cost数组就可以了。 但是稍稍有点难度的动态规划其遍历顺序并不容易确定下来。 例如01背包都知道两个for循环一个for遍历物品嵌套一个for遍历背包容量那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢 这些都与遍历顺序息息相关。当然背包问题后续「代码随想录」都会重点讲解的 举例推导dp数组 拿示例2cost [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 来模拟一下dp数组的状态变化如下 如果大家代码写出来有问题就把dp数组打印出来看看和如上推导的是不是一样的。 总结 大家可以发现这道题目相对于 昨天的动态规划爬楼梯 (opens new window)又难了一点但整体思路是一样的。 从动态规划斐波那契数 (opens new window)到 动态规划爬楼梯 (opens new window)再到今天这道题目录友们感受到循序渐进的梯度了嘛。 第一步不支付费用 public class Climbing_Stairs_with_Minimum_Cost {public int minCostClimbingStairs1(int[] cost) {int len cost.length;int[] dp new int[len 1];//创建一个长度为 cost.length 1 的数组 dp用于存储从第0个台阶到第 len 个台阶的最小花费。dp[0] 0;//从地面第0个台阶或第1个台阶开始爬不需要花费。dp[1] 0;for (int i 2; i len; i) {//从2迭代到 len每次迭代计算到达当前台阶的最小花费并存储在 dp[i] 中。到达第 i 个台阶的最小花费等于到达第 i-1 个台阶的最小花费加上当前台阶的花费或者到达第 i-2 个台阶的最小花费加上当前台阶的花费取两者的最小值。dp[i] Math.min(dp[i - 1] cost[i - 1], dp[i - 2] cost[i - 2]);}return dp[len];//最终返回 dp[len]即到达第 len 个台阶的最小花费。} }时间复杂度O(n)  空间复杂度O(n) 第一步支付费用 public class Climbing_Stairs_with_Minimum_Cost {public int minCostClimbingStairs2(int[] cost) {int[] dp new int[cost.length];//创建一个长度为 cost.length 的数组 dp用于存储从第0个台阶到第 cost.length - 1 个台阶的最小花费。dp[0] cost[0];//初始化 dp[0] 和 dp[1] 为 cost[0] 和 cost[1]因为到达第1个台阶和第2个台阶的最小花费就是它们各自的花费。dp[1] cost[1];for (int i 2; i cost.length; i) {//从2迭代到 cost.length - 1每次迭代计算到达当前台阶的最小花费并存储在 dp[i] 中。到达第 i 个台阶的最小花费等于到达第 i-1 个台阶的最小花费加上当前台阶的花费或者到达第 i-2 个台阶的最小花费加上当前台阶的花费取两者的最小值。dp[i] Math.min(dp[i - 1], dp[i - 2]) cost[i];}return Math.min(dp[cost.length - 1], dp[cost.length - 2]);//最终返回 dp[cost.length - 1] 和 dp[cost.length - 2] 的最小值因为到达顶部可以是从倒数第二步或倒数第三步爬上来的。}}时间复杂度O(n)  空间复杂度O(n) 状态压缩使用三个变量来来代替数组 public class Climbing_Stairs_with_Minimum_Cost {public int minCostClimbingStairs3(int[] cost) {int beforeTwoCost 0, beforeOneCost 0, currentCost 0;//用三个变量 beforeTwoCost、beforeOneCost 和 currentCost 来存储到达前两个台阶和当前台阶的最小花费。for (int i 2; i cost.length; i ) {//从2迭代到 cost.length每次迭代计算到达当前台阶的最小花费并更新 beforeTwoCost、beforeOneCost 和 currentCost 的值。currentCost 等于到达第 i-1 个台阶的最小花费加上当前台阶的花费或者到达第 i-2 个台阶的最小花费加上当前台阶的花费取两者的最小值。然后beforeTwoCost 更新为 beforeOneCost 的值beforeOneCost 更新为 currentCost 的值。currentCost Math.min(beforeOneCost cost[i - 1], beforeTwoCost cost[i - 2]);beforeTwoCost beforeOneCost;beforeOneCost currentCost;}return currentCost;//最终返回 currentCost即到达第 cost.length 个台阶的最小花费。} }时间复杂度O(n)  空间复杂度O(1)
http://www.dnsts.com.cn/news/101447.html

相关文章:

  • 福州网站制作费用集团公司网站开发
  • 全国好的视频制作网站优化seo四个建议
  • 网站建立的步骤是( )。阿里云网站备案需要多久
  • 怎么查询网站是什么时候做的网站前台页面的设计与实现
  • 宝安网站建设(深圳信科)云服务器和网站空间
  • 做网站不赚钱的原因网站建设重庆公司
  • 手机网站代码下载联想用来网站开发笔记本
  • 物流企业网站建设策划书6讯美 深圳网站建设
  • 失信被执行人名单查询官网石家庄seo全网营销
  • 外贸优秀网站网站外链平台的建设方法平台类型(至少5个)?
  • 西安网站制作公司有哪家杭州市建设工程公示网站
  • 山东宏远建设有限公司网站官方网站建设需要哪个部门审批
  • 淘宝客不做网站可以做么响应式网站管理系统
  • 企业电子商务网站的建设方式wordpress中文论坛
  • 庆阳做网站公司什么叫做网站建设
  • 湛江网站建设招聘公司网站策划书
  • 百度搜索推广的五大优势网站关键词优化实验结果分析
  • 为中小型企业构建网站自己做网站平台
  • 网站推广策划内容企业型网站建设步骤及注意事项
  • 山东省建设管理中心网站首页闸北网站优化公司
  • 网站公司注册流程做淘宝优惠网站步骤
  • 展示类网站开发费用哪些网站可以做电脑画画赚钱
  • 有专门教做儿童美食的网站吗咨询公司税率是多少
  • 如何做一元购物网站抖音seo怎么做
  • 石家庄网站小程序dede 网站源码
  • 网站建设职位要求做网站的计划概要
  • 建德网站seowordpress登录框插件
  • 现在从事网站开发如何目前流行的网站分辨率做多大
  • 深圳网站开发制作深圳电器公司排名
  • 我国空间站建造分类网站 模板