程序员常用的几种算法

大家好,我又回来了!下面为大家介绍一下我们程序员最常用的几种算法!!
第一就是模拟算法了,模拟算法是最简单的,也是比较烦人的算法,look look 他的介绍
如何把实际问题建模成数学问题,主要依靠我们的经验和直觉、当然还有你灵动的思维;而算法与数据结构,正是解决数学问题的两把利剑。从这一章开始会介绍一些程序设计竞赛中的一些常见套路算法,而下一部分会介绍基础的数据结构。如果已经认真学
习完了第一部分,相信这一部分也不在话下。这一章是语言部分的延伸,会介绍一些竞赛中会出现的“模拟题目”——这里的“模拟”不是指模拟某场比赛的模拟题,而是指让程序完整的按照题目叙述的方式执行运行得到最终答案。同时也会介绍可以计算很大整数
的高精度运算方法。这一章对思维与算法设计的要求不高,但是会考验编程的基本功是否扎实。 	

这种题呢没有什么模板,全靠思维,那练习题呢就放在这了题单这种算法就不讲了哈,有问题可以私下联系小编。


第二种递归算法,主要就是时间复杂度太高,但是解题十分强大,就不多说了,后面的搜索与回溯算法会用到这种思想。顺便送你道例题,汉诺塔问题。

自己好好思考一下。

#include <bits/stdc++.h>
using namespace std;
void dg(int n, char a, char c, char b) {
    if (n == 1) {
        printf("%c->%d->%c\n", a, n, b);
        return;
    }
    dg(n - 1, a, b, c);
    printf("%c->%d->%c\n", a, n, b);
    dg(n - 1, c, a, b);
}
int main() {
    int n;
    char a, b, c;
    cin >> n >> a >> b >> c;
    dg(n, a, c, b);
    return 0;
}

下面就是递推算法了,主要就是找规律,最经典的例题就是斐波那契数列了题目就不说了,大家自己看看代码,找出递推式* a[i]=a[i-1]+a[i-2]*就出来了

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a[10005];
signed main() {
	cin>>n;
	a[0]=0;
	a[1]=1;
	a[2]=1;
	for(int i=3;i<=n;i++) {
		a[i]=a[i-1]+a[i-2];
	}
	cout<<a[n-1];
}

第四种就是搜索与回溯算法,也就是深度优先搜索算法,十分简单,不要有心理压力,其实不难,无非就是一个个找,找不到就返回,找到了就继续找,找完了返回,就完了。
模板:
void dfs(int x) {
	if(是否满足条件,到终点了没) {
		该干嘛干嘛;
		return ;
	}
	for(int i=1;i<=n;i++/*这个随着变量来就行*/) {
		if(判断一下是否用过) {
			标记成用过;
			记录答案;
			dfs(x+1);//向下找
			标记成没用过;
		}
	}
}
//完美结束

看,是不是十分简单?如果你还不懂,可以用C++调试一下,问题就解决了。如果不知道如何C++调试的,我会再写一篇帖子来教你如何调试。
再看一道经典例题,全排列!!

全排列问题

题目描述

按照字典序输出自然数 1 1 1 n n n 所有不重复的排列,即 n n n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n n n

输出格式

1 ∼ n 1 \sim n 1n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 5 5 个场宽。

样例 #1

样例输入 #1

3

样例输出 #1

    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

提示

1 ≤ n ≤ 9 1 \leq n \leq 9 1n9

#include <bits/stdc++.h>
using namespace std;
int a[15], n;
bool c[15];
void dg(int f) {
    if (f > n) {
        for (int i = 1; i <= n; i++) {
            cout<<setw(5)<<a[i];
        }
        printf("\n");
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (c[i] == 0) {
            c[i] = 1;
            a[f] = i;
            dg(f + 1);
            c[i] = 0;
        }
    }
}
int main() {
    scanf("%d", &n);
    dg(1);
    return 0;
}

你看是不是套着模板来的,十分简单。


圆满结束!!!!!

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值