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

张家港杨舍网站建设谷歌三件套下载

张家港杨舍网站建设,谷歌三件套下载,甘肃省人民政府电话号码,电视盒子做网站服务器题目 给定一个正数n,求n的裂开方法数, 规定:后面的数不能比前面的数小 比如4的裂开方法有: 1111、112、13、22、04 。 5种,所以返回5 暴力递归 用暴力递归方法进行尝试,整体思路是这样: 暴力递…

题目
给定一个正数n,求n的裂开方法数,
规定:后面的数不能比前面的数小
比如4的裂开方法有:
1+1+1+1、1+1+2、1+3、2+2、0+4 。 5种,所以返回5

暴力递归
用暴力递归方法进行尝试,整体思路是这样:

  1. 暴力递归方法需要参数pre(上一个数拆分的大小是多少)和rest(剩余的数大小是多少)
  2. 因为题目所说,base case也可以进行确定为
    2.1 pre > rest 则return 0 后面的数不能小于前面的数。
    2.2 如果拆分后的rest = 0,代表两种情况:
    第一种是满足pre < rest 的情况下全部拆完, return 1。
    另一种是我pre就是当前要拆分的数本身,此时也算是一种拆分方式,return 1。

代码

public static int ways(int n) {if (n < 0) {return 0;}if (n == 1) {return 1;}return process(1, n);}public static int process(int pre, int rest) {//两个if判断必须这个在前。if (rest == 0) {return 1;}if (pre > rest) {return 0;}int ways = 0;for (int first = pre; first <= rest; first++) {ways += process(first, rest - first);}return ways;}

动态规划
依然是根据暴力递归代码改写动态规划,首先根据可变参数pre、rest 确定dp[][]大小为dp[n + 1][n + 1]。
并且根据base case可以确定dp[0 ~ n][0]位置 = 1。并且dp[pre][pre]位置值也为1。
第一点比较好理解,第二个来解释一下。如下图所示:
在这里插入图片描述
因为我暴力递归中ways主方法pre参数是从1开始尝试,所以pre = 0可以忽略不看。
根据base case rest = 0的列值为1,又因为pre 必须小于 rest ,所以 pre > rest的位置全都默认0,接下来我们来看 √ 位置 pre = 3 rest = 3。
这个位置可以将rest拆分成(1,2)、(2,1)、(3,0)。因为rest 要大于 pre。所以此时只有(3,0)这个选项可以进行拆分。拆分后,pre = 3, rest = 3,所以 √ 位置依赖pre = 3 rest = 0位置的数。
所以可以确定dp[pre][pre]对角线位置的值都为1。

代码

 public static int dp(int n) {if (n < 0) {return 0;}if (n == 1) {return 1;}int[][] dp = new int[n + 1][n + 1];for (int pre = 1; pre <= n; pre++) {dp[pre][0] = 1;dp[pre][pre] = 1;}for (int pre = n - 1; pre >= 1; pre--) {for (int rest = pre + 1; rest <= n; rest++) {int ways = 0;for (int first = pre; first <= rest; first++) {ways += dp[first][rest - first] ;}dp[pre][rest] = ways;}}return dp[1][n];}

再次优化
可以看到动态规划的代码中依然还有枚举过程可以进行优化,我们仍然是画图,看每个dp格子之间的位置依赖。如下图所示:
此时我在(2,4)位置,接下来再次进行拆分,会看到它依赖的格子有(2,2)、(3,1)、(4,0)。
在这里插入图片描述
再看x位置(3,4),继续拆分依赖的是(3,1)、(4,0)位置。

在这里插入图片描述

如果将它抽象化的话,此时的pre rest依赖的就是 pre, rest -pre。和 pre + 1,rest的位置。就可以用这个公式将枚举行为来替换掉。

代码

 public static int bestDP(int n) {if (n < 0) {return 0;}if (n == 1) {return 1;}int[][] dp = new int[n + 1][n + 1];for (int pre = 1; pre <= n; pre++) {dp[pre][0] = 1;dp[pre][pre] = 1;}for (int pre = n - 1; pre >= 1; pre--) {for (int rest = pre + 1; rest <= n; rest++) {dp[pre][rest] = dp[pre + 1][rest] + dp[pre][rest - pre];}}return dp[1][n];}
http://www.dtcms.com/wzjs/46207.html

相关文章:

  • 做网站的怎么学小程序开发需要哪些技术
  • 移动端网站模板怎么做免费推广网站2023mmm
  • 厦门做网站哪家强网络游戏推广员是做什么的
  • 汉口做网站的公司百度投稿平台
  • 国内网站开发语言深圳百度推广代理商
  • 做的网站在ie会乱码泰州网站排名seo
  • 四大软件外包公司东莞网站seo公司哪家大
  • 网站建设 技术团队网络营销的方式和方法
  • 济南网站建设策划方案网络营销的五大优势
  • 什么网站做免单衣服网页设计模板html代码
  • 公司网站优化推广方案外链互换平台
  • 临淄网站建设郑州seo顾问外包
  • 淮南市网站开发的方式查图百度识图
  • 如何查看网站域名解析网站seo在线优化
  • 外国网站上做Task在线种子资源网
  • qq可以做公司免费网站百度推广每年600元什么费用
  • 阿里云学生wordpress百度seo点击工具
  • 网站smtp服务器邯郸网站建设优化
  • 南京网站建设包括哪些爱站网长尾关键词挖掘工具电脑版
  • 企业为什么需要网站seo整站优化报价
  • 国家现代农业示范区建设网站境外电商有哪些平台
  • Wix做的网站在国内打不开太原互联网推广公司
  • 网站建设公司中心好搜自然seo
  • 建设局网站施工合同范本前端优化
  • wordpress推广链接优化seo培训班
  • 开通网站的请示销售外包
  • 网站开发全流程新东方线下培训机构官网
  • 做软件推广网站怎么赚钱seo百度关键字优化
  • behance设计网站注册小程序怎么引流推广
  • 服装如何做微商城网站建设推广软文模板