笔者几个月前才转了专业,算法水平还不是很强,所以每周尽量学一点算法的内容。
话不多说,我们开始吧。
在算法入门学习中,这一些问题是最常见的:
Dynamic Programming(动态规划) Greedy(贪心) Complete Search(穷举) Flood Fill (种子填充) Shortest Path (最短路径) Recursive Search Techniques (回溯) Minimum Spanning Tree (最小生成树) Knapsack(背包) Computational Geometry(计算几何) Network Flow(网络流) Eulerian Path (欧拉回路) Two-Dimensional Convex Hull (二维凸包) BigNums (大数) Heuristic Search(启发式搜索) Approximate Search (近似搜索) Ad Hoc Problems(杂题)。
从一个helloworld开始:
OJ的多组输入:
题目一: 输入2个数a b,输出a+b的和. 输入包括多组数据,处理至文件结束,如下:
5 8 13
6 9 15
9 3 12
1 2 3
用C来写的话
#include
int main()
{
int a, b;
while(scanf("%d %d", &a, &b) != EOF)
{
printf("%d\n", a + b);
}
return 0;
}
用C++写的话
#include
using namespace std;
int main()
{
int a, b;
while(cin>>a>>b)
{
cout<
我们尽量不混合c,c++的输入输出方式,数据规模较大,推荐用scanf。
//前话说到这里为止。
我们再谈谈猜数游戏,题目如下:
比如小明说他心中想到一个0-1000之间的数字,这个数字他要告诉给老师,然后让其他人来提问。 提问的人可以问任何问题,但小明只能用YES/NO作答。 请问多少次可以猜到?
首先容易想到的是暴力枚举,其次再是别的策略:比如你回答得是,其他人猜测的数字是低了还是高了?
然后就可以逐渐二分估计策略来简化猜测过程了,这个方法就是决策树吧?(不对请指出)
然后我们再看一个递归策略:
学过c的都知道汉诺塔问题,说白了这也是用递归实现的,只是不是那么直观。这是笔者两个月前补BIT的课之后弄出来的,文件头就不写了,思想还是比较简约,我叙述一下:核心解决方法就是借助过渡杆buffer,完成n-1个盘子借助最后面的杆转移到中间的杆子,然后再把最后那个最大的盘子直接移到最后的杆子,再把第二个杆子里面借助第一个杆子移到第三个杆子。
void move(char getone, char putone)
{
printf("%c--->%c\n", getone, putone); //将一个盘从getone取走,放到putone
}
void hanoi(int n, char one, char two, char three)
//将n个盘从one杆,借助two杆,到达three杆子
{
if (n == 1) move(one, three);
else
{
hanoi(n - 1, one, three, two);
move(one, three);
hanoi(n - 1, two, one, three);
}
}
int main(void)
{
//汉诺塔问题
int m;
printf("Input the number of disks:");
scanf("%d", &m);
printf("The steps to moving the %d disks are as follows:\n", m);
hanoi(m, 'A', 'B', 'C');
system("pause");
return 0;
}
然后还有一个算法就是并行式计算,这里我们先不讲,因为我比较菜。
接下来的水文我来学一学递归方程的解法,单独开,本篇作为引入,到此为止。