zoukankan      html  css  js  c++  java
  • 计算catlan数f(n)(动态规划)

    #include <stdio.h>
    /*计算catlan数f(n),其递推式如下:
             1                  n=0 || n=1
    f(n)={ ∑f(i)*f(n-1-i)         n>1,其中i∈[0,n-1]范围整数
    例如
    f(2)=f(0)*f(1)+f(1)*f(0)=2
    f(3)= f(0)*f(2)+f(1)*f(1)+f(2)*f(0)=2+1+2=5
    f(4)= f(0)*f(3)+f(1)*f(2)+f(2)*f(1)+f(3)*f(0)=5+2+2+5=14
    f(5)= f(0)*f(4)+…+f(4)*f(0)=42
    输出f(n) 
    
    …
    这是一个在很多问题中出现的数列。
    由于这个数列的值递增很快,现在我们只想输出f(n)除以10000007的余数。请写出dp写法一、写法二。
    【注:由于f(n)要用到f(0),f(1)…f(n-1)的值,所以不能写压缩型dp】
    //有意思的是,上面的f(n)=C(2n,n)/(n+1)  比如f(3)=C(6,3)/4=20/4=5
    
    */
    
    long long dp[10000];
    
    long long f(int k)
    {
    	int i;
    	if (k < 0)
    	{
    		return 0;
    	}
    	if (dp[k])	return dp[k];
    	if (0 == k || 1 == k)
    	{
    		return dp[k] = 1;
    	}
    	else
    	{
    		for (i = 0; i < k; ++i)
    		{
    			dp[k] += ((f(i) % 10000007) * (f(k - 1 - i) % 10000007)) % 10000007;
    		}
    		return dp[k] % 10000007;
    	}
    }
    
    int main()
    {
    	int i;
    	for(i=1;i<100;i++)//打印f(1)---f(19) 
    	    printf("%lld
    ", f(i));
    	return 0;
    }

    ========================================Talk is cheap, show me the code=======================================
    CSDN博客地址:https://blog.csdn.net/qq_34115899
  • 相关阅读:
    函数1
    函数
    VC++中GDI和GDI+ 的坐标系统介绍
    CWnd与HWND的区别与转换
    VC++下的Unicode编程
    VS 和Visual Assist X快捷键(转)
    VC中CRect类的简单介绍
    ListControl的用法
    VC:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen
    VC中CDC与HDC的区别以及二者之间的转换
  • 原文地址:https://www.cnblogs.com/lcy0515/p/9179822.html
Copyright © 2011-2022 走看看