zoukankan      html  css  js  c++  java
  • 递归变递推

    这个内容其实很简单。。。

    我们会遇到一些递归题,递归过程很繁琐,无法条理清楚地分析。

    这时,就有一个好东西:递推。

    例子:

    NOIP2018-PJ · 初赛:完善程序 T3:

    #include <iostream>
    using namespace std;
    int n, m;
    
    int findans(int n, int m) {
        if (n == 0) return m;
        if (m == 0) return n % 3;
        return findans(n - 1, m) - findans(n, m - 1) + findans(n - 1, m - 1);
    }
    
    int main(){
        cin >> n >> m;
        cout << findans(n, m) << endl;
        return 0;
    }

    输入:$ ext{5  6}$

    如果写成递归树,那估计一页纸都写不下。

    那应该怎么办呢?

    我们定义 $f_{i,j}$ 是 $ ext{findans(i, j)}$ 的结果,那么会有一些显而易见的结论:

    $f_{0, x} = x$,$f_{x, 0} = ext{x mod 3}.$

    然后也可以得到一个递推式:$f_{i, j}=f_{i-1, j} - f_{i, j-1} + f_{i-1, j-1}$

    然后我们就可以把所有的 $f_{i, j}$ 列成一个矩阵,递推出 $f(n, m)$ 即可。

  • 相关阅读:
    Cake
    抽屉评论数据库设计
    学习网站
    栈和堆简介
    链表相关操作
    链表操作
    Django form验证二
    django ajax提交form表单数据
    jquery中 after append appendTo 的区别
    Python json.dumps 自定义序列化操作
  • 原文地址:https://www.cnblogs.com/zengpeichen/p/11348774.html
Copyright © 2011-2022 走看看