HDU2045~递推

题目出自杭电
HDU2045~递推_第1张图片
思路:
ps:看Source知道这是一道递推题,就想着要找规律了-,-
根据数学中的排列组合:
前n-2个已涂好后,涂第n-1个即有2种情况:
1. n-1的色与n-2和1的色都不相同,那么n就是剩下的那个色,没有选择。
即f(n-1)
2. n-1的色与n-2不相同但与1个色一样,那么n的色就有2个色选择.
即f(n-2)*2

综上得:f(n) = f(n-1) + 2*f(n-2); (n>3)
第一次WA代码:递归版
错误提示:Time Limit Exceeded

#include<stdio.h>
__int64 f(int n)
{
    if(n==1)
        return 3;
    if(n==2)
        return 6;
    if(n==3)
        return 6;
    if(n>3 && n<51)
        return f(n-1)+2 * f(n-2);
}
int main()
{
    int n;
    while(~scanf("%d",&n))
        printf("%I64d\n",f(n));
    return 0;
}

第二次AC的代码:递推版

#include<stdio.h>
int main()
{
    int i;
    __int64 dp[51];
    dp[1]=3;dp[2]=6;dp[3]=6;
    for(i=4;i<51;i++)
        dp[i]=dp[i-1]+dp[i-2]*2;
    while(scanf("%d",&i)!=EOF)
        printf("%I64d\n",dp[i]);
    return 0;
}

错误分析:
Output Limit Exceeded多数发生在递归遍历的过程中。
Time Limit Exceeded,如果你相信你的算法是最优的,那就检查一下什么地方在什么数据下出现了死循环。否则还是考虑换个思路解题的好。要不然,就是时间复杂度太大。
怎么计算时间复杂度?
可以参考:http://blog.csdn.net/firefly_2002/article/details/8008987
递推相对于递归,省了一半时间复杂度

你可能感兴趣的:(杭电)