0%

前言

方格填数(回溯算法求解)

  • 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

  • 回溯法有通用解法的美称,对于很多问题,如迷宫等都有很好的效果。回溯算法实际上一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。回溯法说白了就是穷举法。回溯法一般用递归来解决。

阅读全文 »

前言

  • 问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-20,11,-4,13,-5,-2)时,最大子段和为20。
  • 最大子段和是动态规划中的一种。
阅读全文 »

Java异常简介

Throwable是万恶之源,它是所有异常的父类,它有两个儿子,大儿子叫Error,二儿子叫Exception。

1、Error是系统错误,很少出现,是程序的终结者,我们一般不会期待它的出现。Error有两个儿子,分别是VirtualMachineError和ThreadDath。

阅读全文 »

前言

说明一下问题,什么是整数划分?
n=m1+m2+…+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,…,mi}为n的一个划分。
如果{m1,m2,…,mi}中的最大值不超过m,即max(m1,m2,…,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);
举个例子,当n=5时我们可以获得以下这几种划分(注意,例子中m>=5)
5 = 5
= 4 + 1
= 3 + 2
= 3 + 1 + 1
= 2 + 2 + 1
= 2 + 1 + 1 + 1
= 1 + 1 + 1 + 1 + 1

算法思路&源代码

接下来是我最理解,最喜欢的一种解法:

阅读全文 »

蓝桥杯2016年 C/C++ A组 第五题

消除尾一

下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0
如果最后一位是0,则原数字保持不变。

如果采用代码中的测试数据,应该输出:
00000000000000000000000001100111 00000000000000000000000001100000
00000000000000000000000000001100 00000000000000000000000000001100

阅读全文 »

  • 查找对象:顺序存储的有序表。

  • 思路:由于查找的表是有序的(假设是从小到大),地址在中间位置的元素必然在排序中也属于中间次序。

    step1:设置两个指针,一个(low)指向第一个元素,另一个(high)指向最后一个元素。

    step2:找到中间元素(mid=(low+high)/2)与要查找的元素比较。

    step3:若相等,万事大吉,返回当前位置(mid);

    ​ 若该元素大于目标元素,说明目标元素在左侧,指针high=mid-1,查找左边;

    ​ 若该元素小于目标元素,说明目标元素在右侧,指针low=mid+1,查找右侧。

    step4:重复step2、step3,指针查找到目标元素。

阅读全文 »