Totoro's Home

Welcome (ಡωಡ) !


  • 首页

  • 标签

  • 分类

  • 归档

Algorithm_最长公共子序列

发表于 2018-05-07 | 分类于 ACM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// LongestPublicChildSequence.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
/**
最长公共子序列,子序列指元素间顺序不变,但不要求连续的数组元素集合
最长公共子序列,指两个数组共有的子序列中最长的那个一个
分类:动态规划
作者:夏军
时间:2018年5月7日
**/
int getMax(int a,int b) {
return a>b?a:b;
}

int main()
{
char x[8] = {'A','B','C','B','A','C','B','A'};
char y[6] = {'B','D','C','A','B','A'};
int child[9][7];
//数组初始化
for(int i = 0;i < 9;i++) {
for(int j = 0;j < 7;j++) {
child[i][j] = 0;
}
}

for(int i = 1;i < 9;i++) {
for(int j = 1;j < 7;j++) {
if(x[i] == y[j]) {//末尾相同,公共子序列长度加1
child[i][j] = child[i-1][j-1]+1;
} else {
child[i][j] = getMax(child[i-1][j],child[i][j-1]);
}
}
}

printf("最长公共子序列的长度是:%d",child[8][6]);
return 0;
}

Algorithm_最大子数组问题

发表于 2018-05-06 | 分类于 ACM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// MaxValueChildArray.cpp : 定义控制台应用程序的入口点。
/**
最大子数组问题:求一个数组的子数组,要求子数组的元素的和在所有的子数组中最大
时间复杂度O(n)
这个问题调用了两次动态规划,比较难
@author:XiaJun
@date May 6th,2018
**/

#include "stdafx.h"


int main()
{
int arr[11] = {-2,6,5,-9,1,-3,9,12,-23,18,2};
//以边界为终点的最大子数组和要求的最大子数组
int bound[11],result[11];
//初始化
int i = 0,j = 0;
for(i = 0;i < 11;i++) {
bound[i] = 0;
result[i] = 0;
}
//利用动态规划求边界为终点(当前的遍历索引在子数组的边界)的最大子数组
int curMax = arr[0];
bound[0] = arr[0];
for(i = 1;i < 11;i++) {
if(curMax <= 0) {
curMax = arr[i];
} else {
curMax += arr[i];
}
bound[i] = curMax;
}
//求最终的最大子数组
int maxValue = arr[0];
result[0] = arr[0];
for(i = 1;i < 11;i++) {
if(arr[i] > 0) {//小于0不用考虑,这种情况下最大子数组的和不变
if(arr[i]+bound[i-1] > maxValue) {
maxValue = arr[i]+bound[i-1];//该元素被包含在了最大子数组中
}
}
}
printf("最大子数组的和是:%d\n",maxValue);
return 0;
}

Algorithm_《算法导论》乘法链问题

发表于 2018-05-05 | 分类于 ACM

乘法链问题算是比较好理解的了,晚上写了半个小时就调出来了,作为动态规划的第二篇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Matrix.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

/**
矩阵的乘法链问题:多个矩阵相乘时,怎么加括号,总的乘法次数最小
比如3个矩阵相乘,可以先计算前两个的积,再乘以第三个,也可以先计算后两个的积
再乘以第一个。两种方法的乘法次数不同。
来源:《算法导论》第四版中文版P205
分类:动态规划,算法,ACM
@Author:XiaJun
@Time:May 5th,2018
**/

int main()
{
//6个矩阵,行数和列数
int mat[6][2] = {{30,35},{35,15},{15,5},{5,10},{10,20},{20,25}};

//一个5行5列的矩阵,记录最优子结构的值
int child[6][6];
int i,j,dis,k = 0,min;
//初始化该矩阵
for(i = 0;i < 6;i++) {
for(j = 0;j < 6;j++) {
child[i][j] = 0;
}
}

//两个矩阵相乘的最优子结构的值是已知的
for(i = 0;i < 5;i++) {
child[i][i+1] = mat[i][0]*mat[i][1]*mat[i+1][1];
}

//计算所有的最优子结构
for(dis = 2;dis < 6;dis++) {
for(i = 0;dis+i < 6;i++) {//i:最优子结构的起始处
j = i+dis;//j:最优子结构的结束处
min = mat[i][0]*mat[i][1]*mat[j][1]+mat[i+1][j];
for(k = i;k < j;k++) {
int cur = mat[i][0]*mat[k][1]*mat[j][1]+child[i][k]+child[k+1][j];
min = min > cur?cur:min;
}
child[i][j] = min;
}
}

printf("最少的乘法计算次数是:%d",child[0][5]);

return 0;
}

Algorithm-算法导论装配线问题

发表于 2018-05-03 | 分类于 ACM

最近收到了几份笔试邀请,发现大厂都爱考算法问题,真是让人很无语
不过也没事,你们爱考什么,我就爱搞什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// AssembleLineProblem.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

/**
装配线问题,装配线2条,装配站6个
来源:《算法导论》第四版中文版P192
分类:动态规划,算法,ACM
@Author:XiaJun
@Time:May 3rd,2018
**/

//在装配线上装配的时间
int assembleTime[2][6] = {{7,9,3,4,8,4},{8,5,6,4,5,7}};

//转移的时间
int transTime[2][6] = {{2,2,1,2,2,1},{4,2,3,1,3,4}};

//最后一道流程装配完成后到下线的时间
int offLineTime[2][1] = {{3},{2}};

//求最小值
int getMin(int a,int b) {
return a < b?a:b;
}

int main()
{
//存放到达第几个装配站的最短时间,f[1][1]表示到达第2条装配线的第2个装配站的最短时间
int fast[2][6];
//初始化,C语言这一点很蛋疼
for(int i = 0;i < 2;i++)
for(int j = 0;j < 6;j++)
fast[i][j] = 0;
//初始化装配站1的最短时间
fast[0][0] = transTime[0][0]+assembleTime[0][0];
fast[1][0] = transTime[1][0]+assembleTime[1][0];

//开始计算
for(int j = 1;j < 6;j++) {
//从同一条生产线直接投送过来所需的时间
int sameLine = fast[0][j-1]+assembleTime[0][j];
//从另一条生产线转移过来所需的时间
int otherLine = fast[1][j-1]+assembleTime[0][j]+transTime[0][j];
fast[0][j] = getMin(sameLine,otherLine);

//从同一条生产线直接投送过来所需的时间
sameLine = fast[1][j-1]+assembleTime[1][j];
//从另一条生产线转移过来所需的时间
otherLine = fast[0][j-1]+assembleTime[1][j]+transTime[1][j];
fast[1][j] = getMin(sameLine,otherLine);
}

//最终的结果
int result = getMin(fast[0][5]+offLineTime[0][0],fast[1][5]+offLineTime[1][0]);
printf("最短的装配时间:%d",result);
return 0;
}

Git_git的常用命令

发表于 2018-05-02 | 分类于 Git

1 初始化:git init

2 连接远程仓库:git remote add origin git@gitlab.haihu.com:wangqin/erp-java.git

3 从远程仓库克隆:git clone git@gitlab.haihu.com:wangqin/erp-java.git

4 切换分支:git checkout new_branch

5 查看分支:git branch,带*为当前的分支

6 创建并切换分支:git checkout -b new_branch

7 删除分支:git branch -d new_branch

8 查看所有分支,包括远程分支:git branch -a

9 远程更新了,本地未更新,将远程拉取到本地:git pull origin master

10 本地更新,远程未更新,将本地推送到远程:git push origin master

11 提交更新:git commit -m “信息”

12 将所有更新保存到暂存区:git add –all

13 查看当前分支与xxx分支的区别(commit之后的区别!):git diff xxx

14 远程分支的表示:origin/master,比如切换到远程master:git checkout origin/master

Mysql_Windows下Mysql常用命令行

发表于 2018-05-01 | 分类于 MySql

1 展示数据库:show databases;

2 当前用户:select user();

3 展示数据表:show tables;

4 使用数据库:use testdatabase;

5 查看版本:select version();

6 删除数据库:drop database testdatabase;

7 创建数据库(设置了字符集):create database testdatabase default charset utf8 collate utf8_general_ci;

8 删除数据表:drop table table_name;

9 查看当前所在的数据库:select database();

10 查询表的字段:show columns from table_name;

11 查询表的字段的名字以及注释:select COLUMN_NAME,COLUMN_COMMENT from information_schema.columns where table_name=’表名’;

你好,我们认识一下吧

发表于 2018-04-21

Thanks for Hexo and Next!

我的GitHub,欢迎merge.

XiaJun

笔记

7 日志
3 分类
4 标签
© 2018 XiaJun
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4
您是第 位来到Totoro大森林的人(ಡωಡ)