2018.01.01(数字三角形,最长上升子序列等)

2017.12.24

 简单的动态规划

1.数字三角形(算法引入)

题目描述:下图所示是一个数字三角形,其中三角形中的数值为正整数,现规定从最顶层往下走到最底层,每一步可沿左斜线向下或右斜线向下走。设三角形有n层,编程计算出从顶层到底层的一条路径,使得该路径上的和最大,输出最大值。(n<=100)

思路&&代码(搜索回溯):

最显而易见的思路,既然要求一条最短的路径,最简单的方法就是遍历所有的路径,找到一条最优的。时间复杂度是O(2n)以下是搜索代码。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int map[101][101],n;
 5 int count=0,ans=-20180101;
 6 void search(int x,int y){
 7   count+=map[x][y];
 8   if(x==n){
 9     if(count>ans)ans=count;
10   }
11   else{
12   search(x+1,y+1);
13   search(x+1,y);
14   }
15   count-=map[x][y];
16 }
17 int main(){
18   scanf("%d",&n);
19   int i,j;
20   for(i=1;i<=n;i++){
21     for(j=1;j<=i;j++){
22       scanf("%d",&map[i][j]);
23     }
24   }
25   search(1,1);
26   printf("%d\n",ans);
27   return 0;
28 }
View Code

思路&&代码(分治法):

对于任意一个点,我们可以把它的最大值和看成Max(sum[i+1][j],[i+1][j+1]),分解为两个规模更小的子问题。但是本质上和搜索没有区别,所以时间复杂度还是O(2n)。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int n,map[101][101];
 5 int fenzhi(int x,int y){
 6   if(x==n)return map[x][y];
 7   int zi1,zi2,_max;
 8   zi1=fenzhi(x+1,y);
 9   zi2=fenzhi(x+1,y+1);
10   if(zi1<=zi2)_max=zi2;
11   else           _max=zi1;
12   return _max+map[x][y];
13 }
14 int main(){
15   scanf("%d",&n);
16   int i,j;
17   for(i=1;i<=n;i++){
18     for(j=1;j<=i;j++){
19       scanf("%d",&map[i][j]);
20     }
21   }
22   printf("%d",fenzhi(1,1));
23   return 0;
24 }
View Code

思路&&代码(记忆化):

比搜索要更优。我们注意到,不管是搜索还是分治,它们都是O(2n)的时间复杂度,是因为它们算了一些重复的东西。既然有重复,那我就把这些重复算的东西用一个数组保存起来,要用时就不用再去算一遍,只要调用了。所以把时间复杂度大大提升了,只有O(n2)了。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int map[101][101],book[101][101];
 5 int n;
 6 int max(int x,int y){
 7   if(y>x)
 8     return y;
 9   else
10     return x;
11 }
12 int search(int r,int c){
13   int ans;
14   if (r==n) return map[r][c];
15   if (book[r+1][c]==-1)
16     book[r+1][c]=search(r+1,c);
17   if (book[r+1][c+1]==-1)
18     book[r+1][c+1]=search(r+1,c+1);
19   ans=max(book[r+1][c],book[r+1][c+1])+book[r][c]; 
20   return ans;
21 }
22 int main(){
23   scanf("%d",&n);
24   int i,j;
25   for(i=1;i<=n;i++){
26     for(j=1;j<=i;j++){
27       scanf("%d",&map[i][j]);
28       book[i][j]=-1;
29     }
30   }
31   printf("%d",search(1,1));
32   return 0;
33 }
View Code

思路&&代码(动态规划):

自底向上。第i层的任意一个点,其最大值是它自己加上它下一层的两个点的最大值之和。用i表示行,j表示列,状态转移方程如下。这样,时间复杂度也只有O(2n)。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int map[101][101],book[101][101];
 5 int max(int x,int y){
 6   if(x>y)return x;
 7   else   return y;
 8 }
 9 int main(){
10   int n;
11   scanf("%d",&n);
12   int i,j;
13   for(i=1;i<=n;i++){
14     for(j=1;j<=i;j++){
15       scanf("%d",&map[i][j]);
16     }
17   }
18   for(j=1;j<=n;j++)
19     book[n][j]=map[n][j];
20   for(i=n-1;i>=1;i--)
21     for(j=1;j<=i;j++)
22         book[i][j]=max(book[i+1][j+1],book[i+1][j])+map[i][j];
23        printf("%d",book[1][1]);
24   return 0;
25 }
View Code

2.最长上升子序列

思路:

对于以第i个数为右端点的一个序列,他本身就是一个长度为1的上升子序列。这时,如果它的右边有比它数值更小的数,这时的最长上升子序列就是这个元素本身的长度1和以他前面的比他数值更小的这个元素为右端点的最长上升子序列的长度和。

状态转移方程:sum[i]=_Max(sum[i],sum[j]+1);  (j<i,num[j]<num[i])

核心代码:

 1 sum[1]=1;
 2     for(i=2;i<=n;i++){
 3         sum[i]=1;
 4         for(j=1;j<i;j++){
 5             if(num[j]<num[i]){
 6                 sum[i]=_Max(sum[i],sum[j]+1);
 7             }
 8         }
 9     }
10     for(i=1;i<=n;i++)
11         max=_Max(max,sum[i]);
View Code

状态:AC

转载于:https://www.cnblogs.com/yzyl-Leo-wey/p/8167768.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac iOS 允许从任何来源下载应用并打开

一个快捷的小知识点&#xff0c;mark&#xff01; 允许从任何来源下载应用并打开&#xff0c;不用手动去允许&#xff0c;更加简洁&#xff01; 只需一行命令 sudo spctl --master-disable 1.正常情况下&#xff0c;打开偏好设置&#xff0c;选择安全性与隐私&#xff0c;界面是…

ES5-4 函数基础与种类、形实参及映射、变量类型

模块编程原则&#xff1a;高内聚&#xff0c;低耦合&#xff08;重复部分少&#xff09;&#xff0c;让一个模块有强的功能性、高的独立性 → 单一责任制&#xff0c;用函数进行解耦合。 1. 函数命名规则 不能以数字开头可以以字母_$开头包含数字小驼峰命名法 函数声明一定有…

ES5-5 参数默认值、递归、预编译、暗示全局变量

1. 参数默认值 默认是undefined形参可以有默认值&#xff0c;形参、实参哪个有值取哪个ES6&#xff0c;默认值属于ES6的内容&#xff0c;打印出的是符合人性化的结果形参有默认值&#xff0c;形参、实参无法统一、无论实参传入有值还是undefined&#xff08;代码表现&#xff…

ES5-6 作用域、作用域链、预编译、闭包基础

1. 作用域 上一级在执行时&#xff0c;内部函数被定义&#xff0c;内部函数便生成作用域和作用域链&#xff08;拿上一级的环境&#xff09;&#xff0c;内部函数执行前生成自己的AO&#xff0c;并排在头部函数执行结束时&#xff0c;AO被销毁&#xff08;回到被定义时的状态&…

electron 项目的搭建方式,借助 node 和 npm

1&#xff0c;首先确定安装了 node 和 npm 2&#xff0c;创建一个文件夹&#xff0c;如 aa 3&#xff0c;CMD 命令进入到 aa&#xff0c;用 npm 命令初始化一个项目 4&#xff0c; npm -init 根据提示完成配置 5&#xff0c;安装 electron > npm i -D electronlatest, 这一…

ES5-7 立即执行函数、闭包深入、逗号运算符

1. 立即执行函数 定义在全局的函数只有关闭浏览器或者退出程序才会释放IIFE: Immediately-Invoked Function Expression解决页面加载自动执行&#xff0c;执行完成后立即释放&#xff08;避免了只会执行一次的内容一直存在于全局&#xff09;IIFE用匿名函数或者函数声明&#…

redis安装(linux)

一、redis安装步骤 1、yum install gcc 如果你机器已经安装了编译环境请忽略&#xff0c;否则在使用make编译源码时会报错。 报错信息&#xff1a;make: *** [adlist.o] 2、使用wget命令下载包  wget http://download.redis.io/releases/redis-4.0.6.tar.gz 3、解压tar包 tar…

ES5-8 闭包高级、对象、构造函数、实例化

1. 对象 对象内定义的函数一般称之为方法&#xff0c;在外部的函数声明称为函数对象删除属性使用delete 关键字 var obj {a: 1,b: string } console.log(obj, obj) // {a: 1, b: "string"} delete obj.b console.log(obj, obj) // {a: 1}在对象里&#xff0c;this…

es6 --- 使用生成器交替执行

考虑以下场景: var a 1; var b 2;function foo(){a;b b * a;a b 3; }function bar(){b--;a 8 b;b a * 2; }foo(); bar(); console.log(a, b); // 11 22bar(); foo(); console.log(a, b); // 183 180对于上面的两个函数foo和bar,它们中的任何一个,一旦开始了就会…

ES5-9 【utils】构造函数及实例化原理、包装类

1. 构造函数 调用构造函数实际会经历4步 1 创建一个新对象 2 将构造函数的作用域赋值给对象&#xff08;因此this就指向了这个对象&#xff09; 3 执行构造函数中的代码&#xff08;为这个新对象添加属性&#xff09; 4 返回新对象 在构造函数内部&#xff0c;this指向构造函数…

Mysql5.7.20使用group by查询(select *)时出现错误--修改sql mode

使用select * from 表 group by 字段 时报错错误信息说明&#xff1a; 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column haha_db.staff.id which is not    functionally dependent on columns in GROUP BY clause; this…

ES5-10 原型、原型链、闭包立即执行函数、插件开发

重学第六章 1. 原型 实例内属性和原型上属性重名时&#xff08;屏蔽&#xff09; function Test(name) {this.name name } Test.prototype.name hhh let tObj new Test(yyy) console.log(tObj.name) // yyy tObj.name null console.log(tObj.name) // null delete tObj.…

性能优化杂记

webpack 开发、生产环境配置不同的webpack配置文件 生产环境删除devServer&#xff08;不需要启webpack devServer&#xff09; 告诉webpack&#xff0c;生产、开发分别要对应哪个配置文件 开发环境下也能看到打包的结果 npm run dev:build npm run dev 只会把打包生产…

算法 --- 冒泡排序、选择排序、插入排序的js实现

冒泡排序: function bubbleSort(arr){let i arr.length;while(i >0){for(let j 0; j< i; j) {let pos 0;if(arr[j] > arr[j1]) {pos j;let temp arr[j];arr[j] arr[j1];arr[j1] temp;}}i pos;}return arr; } var arr [3,44,38,5,47,15,36,26,27,2,46,4,19,5…

appium--每次启动会重新安装的问题(没试过)

有人说加这个 最后 大神说 在appium哪里就可以设置了 对&#xff0c;第一个不勾选就不会安装了【经理】[Java]大连●Messi_Z(726862194) 15:54:10把这些东西全去掉就好了转载于:https://www.cnblogs.com/kaibindirver/p/8205031.html

爬虫从入门到放弃 - 纯新手学习-爬虫基本原理

1.什么是爬虫&#xff1f; 请求网站并提取数据的自动化程序 请求&#xff1a;客户端向服务端发送请求获得网页资源&#xff0c;是一段html代码&#xff0c;包含html标签和一段信息。 提取&#xff1a;提取出想要的信息&#xff0c;然后将结构化的数据存储到文本 自动化&#xf…

ES5-11原型与原型链深入、对象继承

原型 谁调用&#xff0c;this就指向谁&#xff0c;当实例对象有该属性时&#xff0c;不会去原型上查找 创建对象的两种方法&#xff1a;字面量、new Object&#xff08;&#xff09;一般不用后面的二者创建出来的对象没有差异 Object.create() var 实例 Object.create(对象…

算法 --- 希尔排序、归并排序、快速排序的js实现

希尔排序: function shellSort(arr) {let len arr.length;let temp, gap 1;while(gap < len/3) {gap gap*3 1}while(gap >1) {for(let i gap;i< len; i) {temp arr[i];for( var j i-gap; j> 0 && arr[j] > temp; j - gap) {arr[j gap] arr[j];}…

ES5-12 【utils】继承深入、call、apply、圣杯模式、模块化

继承深入 这两种方式继承不够合理&#xff08;为什么&#xff09; 将实例作为子类的原型 在子类的构造函数内部借用父类的构造函数 将父类的原型作为子类的原型&#xff08;会修改父类的原型&#xff09; css圣杯布局&#xff08;左右宽度固定、中间自适应&#xff09…

vue实现星级评价效果

希望对你们有用&#xff0c;已经自己试过可以的才发布出来的 效果如下&#xff1a; html&#xff1a; <template> <div class"evaStar"> <ul class"star"> <li v-for"(itemClass,index) in itemClasses" :class"itemC…