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

要做网站到哪里做/网站设计规划

要做网站到哪里做,网站设计规划,个人备案的域名拿来做别的网站,尚硅谷python基础教程《算法竞赛入门》中动态规划的第一个例子就是经典的数字三角形问题。 数字三角形问题: 问题描述: 有一个由非负整数组成的三角形,每一行只有一个数,除了最下行之外每个数的左下外和右下方各有一个数。 13 24 10 1 4 …

《算法竞赛入门》中动态规划的第一个例子就是经典的数字三角形问题

数字三角形问题:

问题描述:
有一个由非负整数组成的三角形,每一行只有一个数,除了最下行之外每个数的左下外和右下方各有一个数。

       13    24   10   1  4   3    2   20           最大值为1+2+1+20 = 24

从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来,和最大的是多少?

分析:
这一个动态的决策问题。从第一行开始,要么向左,要么向右。如果把所有路线全部暴力出来再取其中最大这个方法是不是可行的呢,然而一共有2^n-1条路,显然这是非常慢的。

还有其他的方法吗? 我们抽象的分析一下这个题目,把当前的位置(i,j)看成一个状态,并定义dp[i][j]为从(i,j)出发走到最后一行最大和

而从dp[i][j]开始走有两个选择:
1.向左走,则走到(i+1,j) ,那么需要求dp[i+1][j]
2.向右走,则走到(i+1,j+1),那么需要求dp[i+1][j+1]
所以就得出了这样的一个状态转移方程:dp[i][j] = a[i][j] + max(dp[i+1][j] , dp[i+1][j+1] )

通过这个状态转移方程我们可以写出它的递归函数
代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 10000+10;
int n,a[maxn][maxn];int solve(int i,int j)
{return a[i][j]+(i==n?0:max(solve(i+1,j),solve(i+1,j+1)));
}//通过状态转移方程写出的递归函数
int main()
{cin>>n;for(int i=n;i>=1;i--){for(int j=1;j<=i;j++){cin>>a[i][j];}}cout<<solve(1,1)<<endl;//即解出从位置(1,1)走到最后一行的最大和return 0;
}

但是我们分析一下这个过程
我们可以看到从(2,1)向右走到达(3,2),而从(2,2)向左走也到达(3,2),所以如果按照这个递归,有些结点多走了,从这张图中可以看出有许多结点是重叠的。
这里写图片描述

记忆化

那么这时需要一个数组来保存走过的结点,这样以后再走到这个结点就直接使用它已经计算过的值,不用再多计算一遍了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000+10;
int dp[maxn][maxn],a[maxn][maxn];
int n;int d(int i,int j)
{if(dp[i][j]>=0) return dp[i][j];//采用记忆化的方式,减小时间复杂度 return dp[i][j]=a[i][j]+(i==n?0:max(d(i+1,j),d(i+1,j+1)));
}
int main()
{memset(dp,-1,sizeof(dp));scanf("%d",&n);for(int i=n;i>=1;i--){for(int j=1;j<=i;j++){scanf("%d",&a[i][j]);}}printf("%d\n",d(1,1));return 0;
}

这种用递归的方式来解决动态规划问题在《算法导论》中被称为“自顶而下”的方式。那么相反的就会有“自下而上”的方式,那就是用来记录,通过递推进行动态规划。


自下而上,进行递推:

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 10000+10;
int d[maxn][maxn],a[maxn][maxn];
int n;int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){scanf("%d",&a[i][j]);}}for(int i=1;i<=n;i++){d[n][i] = a[n][i];//从边界出发的最大值就是其本身 }for(int i=n-1;i>=1;i--){for(int j=1;j<=i;j++){d[i][j] = a[i][j]+max(d[i+1][j],d[i+1][j+1]);}}printf("%d\n",d[1][1]);return 0;   } 

注意:用递推的方式记录需要有一个边界值,否则就无法进行递推。

http://www.jmfq.cn/news/5175037.html

相关文章:

  • 自己建设企业网站/杭州专业seo服务公司
  • 做网站字体一般设置/关键词搜索工具好站网
  • 做网站用小型机或服务器/长尾关键词是什么
  • 怎么接做网站的任务/查看域名每日ip访问量
  • 网站面试通知表格怎么做/西安网站优化培训
  • 无锡网站建设公司怎么样/怎么免费创建网站
  • 所有免费的网站有哪些/泉州排名推广
  • 做网站的一个月能赚多少钱/公司网站免费建站
  • 做网站 需要什么营业执照/深圳市社会组织总会
  • 互联网金融p2p网站建设模板/关键词优化难度查询
  • 南通网站制作计划/合肥seo推广培训班
  • 推广游戏网站怎么做/品牌推广方案包括哪些
  • 找团队做网站/推广搜索引擎
  • 深圳哪里可以做物流网站/互联网推广
  • 2免费做网站/长沙百度推广排名
  • 装修案例分析/seo专业课程
  • 名师工作室网站建设现状调查/培训计划模板
  • 网站恶意刷/郑州seo课程
  • 教育网站制作服务/广点通广告投放平台
  • 中国第一营销网/seo初学教程
  • 乌鲁木齐网络问政平台/网站优化培训
  • 业务自助下单平台网站/百度seo指南
  • 付网站建设费用 会计科目/台州网站seo
  • 山东泰安区号/快速网站排名优化
  • 如何申请com网站/百度网站排名优化
  • 销售平台网站建设/百度指数关键词搜索趋势
  • 互联网建设企业网站/国内推广平台有哪些
  • 成都网站建设服务/百度云网盘搜索引擎入口
  • 免费网站建设塔山双喜/百度排名
  • 吉林省工程建设标准网站/运营商推广5g技术