zoukankan      html  css  js  c++  java
  • 递推 N循环问题

    Description

      我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分。例如,
    如果代码中出现
    for(i=1;i<=n;i++) OP ;
    那么做了n次OP运算,如果代码中出现
    fori=1;i<=n; i++)
      for(j=i+1;j<=n; j++) OP;
    那么做了n*(n-1)/2 次OP 操作。
    现在给你已知有m层for循环操作,且每次for中变量的起始值是上一个变量的起始值+1(第一个变量的起始值是1),终止值都是一个输入的n,问最后OP有总共多少计算量。

    Input

      有T组case,T<=10000。每个case有两个整数m和n,0<m<=2000,0<n<=2000.

    Output

      对于每个case,输出一个值,表示总的计算量,也许这个数字很大,那么你只需要输出除1007留下的余数即可。

    Sample Input

    2
    1 3
    2 3

    Sample Output

    3
    3


    解题思路:
    求类似这种问题,把数带进去算几遍,其中必然存在一定的规律,或是函数关系,或是递归,
    耐心写下几组,甚至几十组测试数据 ,你就会得到其中的联系
    关键字:排列组合,杨辉三角
    公式:a[i][j]=(a[i-1][j]+a[i-1][j-1])
    第一列全为1,a[i][i]也为1.

    代码如下:
    #include "iostream"
    #include "stdio.h"
    #include "string.h"
    using namespace std;
    int a[2004][2004];
    int main()
    {
        int n,m,k,i,j;
        memset(a,0,sizeof(a));
    
        for( i=1;i<=2000;i++)
        {
            a[i][0]=a[i][i]=1;
    
        for( j=1;j<i;j++)
        a[i][j]=(a[i-1][j]+a[i-1][j-1])%1007;
    
        }
        scanf("%d",&n);
        while (n--)
        {
            scanf("%d%d",&m,&k);
            printf("%d
    ",a[k][m]);
        }
    return 0;
    }
    

      

  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/llfj/p/5726536.html
Copyright © 2011-2022 走看看