ACM入门算法之---递归专场

递归算法就是在函数或子过程的内部,直接或者间接地调用自己的算法,在ACM中它是一个入门级的算法,题目一般非常简单。它一般解决三类问题:

(1) 数据的定义是按递归定义的。(Fibonacci函数)

(2) 问题解法按递归算法实现。(回溯)

(3) 数据的结构形式是按递归定义的。(树的遍历,图的搜索)

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,并且在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序

递归是非常工具性的算法,常用于其他算法的实现,例如递归常与分治算法一同出现,也在深搜,递归建树,树的递归遍历等等地方使用,在很多的模拟题中也有很大的作用,往往使得代码变得十分清晰和精短。

    同时ACM中递归的题目也相对简单以下是我做过的一些简单题的总结。

  下面HDOJ 2044 到 HDOJ 2050是很好的入门级别的递归练习,当然,有的题还是很有难度。 

You has solved this problem :-) 2044  一只小蜜蜂... 36.87%(8238/22344)
HDOJ 2044 

         解题思路:1)每到一个点的路径数肯定等于它左边和左下方(左上方)的路径之和。
              2
)设从a走到b之间一共走n步,则有:
                  dp[n]=dp[n-1]+dp[n-2]; dp[n-1]=dp[n-2]+dp[n-3]..............

贴下代码:

#include 
#include 
#include  
using namespace std;
long long a[55];
int T,n,m;
int main()
{    
    a[0]=0;
    a[1]=1;
    a[2]=2;
    for (int i=3; i<=50; i++)
    {
        a[i]=a[i-1]+a[i-2];
    }
    cin >> T;
    while (T--)
    {
        cin >> n >> m;
        cout << a[m-n] << endl;
    }
    return 0;
}


HDOJ 2045/2046/2047/2048/2049差不多都是一样的思想,大家就慢慢推理吧。

       重点说说   HDOJ2050:

      这题当初我也是CP的,大家可以参考:    http://blog.sina.com.cn/s/blog_6716a7270100hzpu.html    , 这里讲的很不错,当大家看明白这篇文章时,我想A掉2050就变得很简单了。

     

 
  
解题思路: 主要是用到递推即可。递推过程:首先分析直线分平面最多多少份:
f(1)=2;f(2)=4;f(3)=7;f(4)= 11……可知f(n)=f(n-1)+n且f(1)=2. 可知f(n)=(1+n) *n/2+1;
同理,可将每个折线看成是两条直线,但是少 了一半。因此每一条折线比两 条直线分割的面的部分少2。因此n条折线比2n条直线分割平面形成的部分少2n。
所以f(n)=2*n^2-n+1;
CP的代码:
#include  
using namespace std;  
int main()  
{  
    int n;  
    cin>>n;  
    while(n)  
    {  
        int m;  
        cin>>m;  
        int sum=2*m*m-m+1;  
        cout<


 


你可能感兴趣的:(ACM算法总结,切题,算法,工具,存储)