标签:track double backtrac 需要 i++ 分支 style for 递归
使用排列组合计算公式来计算,注意使用long long型数据保证计算不会溢出。
class Solution { public: int M, N; int X = 0; //从根到叶子有多少个分支,就表示有多少种路径 //解空间是一个包含{0,1}的集合,总共有(m-1)+(n-1)个元素。 void BackTrack(int x, int y) { if (x == M &&y == N) { //到达叶子节点 X++; return; } if (x < M) { BackTrack(x + 1, y); } if (y < N) { BackTrack(x, y + 1); } } long long FA(long long a) //定义阶乘函数FA { long long x = 1;//定义变量b for (int i = 1; i <= a; i++)//计算阶乘 x *= i; return x;//返回值得到b=a! } long long FA(long long a, long long b) //定义阶乘函数FA { //long long b = 1;//定义变量b long long x = 1; for (int i = b; i <= a; i++)//计算阶乘 x *= i; return x;//返回值得到b=a! } int uniquePaths(int m, int n) { //M = m - 1; //N = n - 1; //BackTrack(0, 0); //return X; //单纯计算数量,可以不用递归,只需要计算选择数即可 /*double res = 1; for (int i = 1; i <= n - 1; i++) res *= ((double)(m + i - 1) / (double)i); return (int)round(res);*/ long long a = FA(m - 1 + n - 1, max(m, n)); long long b = FA(min(m, n) - 1); return (int)(a / b); } };
标签:track double backtrac 需要 i++ 分支 style for 递归
原文地址:https://www.cnblogs.com/asenyang/p/9739666.html