算法思想描述
针对类型:对于只有两个分支选择的“树”形结构,
我们可以尝试利用此方式进行每个节点的遍历。
缺点:需要计算的次数较多。
具体方法为:
1.设置一个变量控制次数,若需要遍历n层二叉树,这个数需要 从0 变化到 2n-1次方(选择n-1次)
2.对于该数,利用循环模拟生成它的二进制的每一位
例· 数字三角形/非动态规划方法
【题目来源于网络】
题目描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图一)
图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。
每一步只能由当前位置向左下或右下。
·输入
你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试数。
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。
·输出
输出每次测试的最大值并且占一行。
·样例输入
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
利用该方法的一个解法(非最优解)
最优解!!!!!!!!!!!!!!!!!!!!!
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#pragma warning(disable : 4996)
int b[50], n;
char a[51];
int main()
{
while (scanf("%d", &n) != EOF)
{
memset(a, 'y', sizeof(a));
int rest = n,//剩下的数
p = 1,//位置
m = 1;//两个1/2
while (rest != 0)
{
if (m = 2)
{
a[p] = 'n';
b[n - rest] = p;
rest--;
m = 1;
}
if (a[p] == 'y')m++;
p++;
if (p > n)
p = p - n;
}
for (int i = 0; i < n - 2; i++)
printf("%d ", b[i]);
printf("\n%d %d", b[n - 1], b[n - 2]);
}
system("pause");
return 0;
}
分析
这种方法有些麻烦,但是用来理解这个方法是不错的。
主要的算法是,“判断每次向左还是向右查找”。
利用二进制0/1可以完成此操作。
0表示左,1表示右。