zoukankan      html  css  js  c++  java
  • 9519 偷吃(递推)

    9519 偷吃

    该题有题解

    时间限制:1000MS  内存限制:65535K
    提交次数:251 通过次数:73

    题型: 编程题   语言: G++;GCC

     

    Description

        超牛和lyd最近买了好多零食啊,可是呢,因为龙教很贪吃,经常偷吃他们的东西。
        为了要让龙教吃不到,他们想到了个方法,他们叫pkkj给他们n个箱子,然后他们就把箱子排成一列,把他们买回来的三种零食(包括薯片,果冻还有饼干)放进那里面。
        然后让龙教猜箱子里面的食物,只有两次机会,猜不到就没得吃。
        所以他们想让相邻的箱子里面放的东西不相同(如果箱子数大于1,那么头尾的食物也不能相同)。
        他们想知道到底有多少种放法,因为他们迷上三国杀,懒得想,所以就请聪明的你帮他们算算吧。
    




    输入格式

        输入数据包含多个测试实例,每个测试实例占一行,即pkkj给他们的箱子数n,(0<n<=50)。 



    输出格式

        对于每个测试实例,请输出全部的满足要求的放法,每个实例的输出占一行。



     

    输入样例

    1
    2
    



     

    输出样例

    3
    6



    题解

    用递推式做。
    an表示n个格子放m种东西方法数,
    那么an=m*(m-1)^(n-1) - 首尾相同的个数的情况
    假设首尾相同 那么首尾可以看成一件物品
    那么就是a(n-1)了
    所以递推公式就是an=m*(m-1)^(n-1)-a(n-1)
    其他注意地方,n最大为50,所以要用long long防止溢出

    #include <iostream>
    #include <cstdio>
    using namespace std;
    long long pow(long long di,int zhi)
    {
        long long ans=1;
        for (int i=0;i<zhi;i++)
        ans*=di;
        return ans;
    }
    long long f(int n)
    {
        if (n==1)
        return 3;
        if (n==2)
        return 6;
        return 3*pow(2,n-1)-f(n-1);
    }
    int main()
    {
        int n;
        while (scanf("%d",&n)>0)
        {
            printf("%lld
    ",f(n));
        }
        return 0;
    }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 相关阅读:
    Palindrome Partitioning
    Minimum Path Sum
    Maximum Depth of Binary Tree
    Minimum Depth of Binary Tree
    Unique Binary Search Trees II
    Unique Binary Search Trees
    Merge Intervals
    Merge Sorted Array
    Unique Paths II
    C++ Primer Plus 笔记第九章
  • 原文地址:https://www.cnblogs.com/scaugsh/p/5532537.html
Copyright © 2011-2022 走看看