zoukankan      html  css  js  c++  java
  • hdu 2502 月之数(水)

    点击打开链接

    我推了很久,说一下我的想法,不知可不可行,我是这样想的,递推的话首先是去找F(N)与F(N-1)的关系,因为第一位只可能是一(从左往右看)可以先得到F(N)=F(N-1)+.........当第二位是1 的时候,即将F(N)可视为1与F(N-1)结合,对F(N-1)存在合法组合数(比如3的合法组合为100 101 110 111,即2^(3-1)种,而不是F(N-1) 的值,不要搞混淆了)从而此时可得到F(N)=F(N-1)+2^((N-1)-1)+.......从而当第二位为0时,同样可推到+2^(N-2)*1,现在得到的了F(N)相对于F(N-1)增加了1的总值(1*(N-1 位的组合数值)),F(N)=F(N-1)+2^(N-2)+2^((N-1)-1)+.......,,,当第一位是1且第二位是0时,就只需考虑后面N-2位的1的总值了,因为每位都可以为0和1,所以组合和数为2^(N-2)种,如果全是1的话,总值为(N-2)*2^(N-2);因为1和0出现的概率相同,各为50%,所以后(N-2)位总值是(N-2)*2^(N-2)/2,从而可推出F(N)=F(N-1)+2^((N-2)+2^((N-1)-1)+(N-2)*2^(N-2);

    化简公式得 F(N)=F(N-1)+(N+2)*2^(N-3)   (N>=3)

    #include<stdio.h>
    #include<math.h>
    int main()
    {
    	int nCase,n,i,a[21];
    	scanf("%d",&nCase);
    	while(nCase--)
    	{
    		scanf("%d",&n);
    		a[1]=1;a[2]=3;a[3]=8;
    		for(i=4;i<=n;i++)
    			a[i]=a[i-1]+(i+2)*pow(2,i-3);
    		printf("%d\n",a[n]);
    	}
    	return 0;
    }


  • 相关阅读:
    修改注释的风格
    PHP in_array
    PHP end
    PHP each
    GitHub和SourceTree入门教程
    面试题解析(不定时更新)
    Container With Most Water
    Minimum Path Sum
    Generate Parentheses
    Unique Paths
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365249.html
Copyright © 2011-2022 走看看