hdu 2044(蜜蜂)2045(RPG难题)2046(骨牌铺方格)2047()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 2044(蜜蜂)2045(RPG难题)2046(骨牌铺方格)2047()相关的知识,希望对你有一定的参考价值。

2044:没有仔细思考就看了题解,知道这样不好,但是还有8天就要比赛了,真是心虚到不要不要的,我打算这几天尽量把11页上的水题刷完,在回过头看看,因为实在是没有时间啦,至少到时候我不能在这些水题丢分哪。质变才能量变!!

题解:这个题可以用递归但是还有更简单的方式:

看到蜂巢上的数字其实可以明白了。相差为1或2的两个蜂巢都只有一条路能通到。而相差3的呢?其实就是走到b点相邻点的方式有几种,与b直接相邻的这有两个点。那到b定其实就是到b-1点和到b-2点的路数之和,这就回到了大家很熟悉的斐波那契数列了。

天哪,要用__int64,不然会报错。

技术分享图片
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<cmath>
//#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    int a,b;
    __int64 f[55];//注意int是不行的
    cin>>n;
    f[1]=f[2]=1;//注意不是f[0]和f[1]
    for(int i=3;i<55;i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
    while(n--)
    {
        scanf("%d%d",&a,&b);
        printf("%I64d\n",f[b-a+1]);
    }
    return 0;
}
View Code

2045:题意:有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.  

也是一道递推找规律的题,首先易知f(1)=3;f(2)=6;f(3)=6;f(4)=18;

现在考虑n>3的情况,若第n-1个格子和第一个格子不同,则为f(n-1);

若第n-1个格子和第1个格子相同,则第n-2个格子和第一个格子必然不同,此时为f(n-2)再乘第n-1个格子的颜色数,很显然第n-1个格子可以是第一个格子(即第n-2个格子)的颜色外的另外两种,这样为2*f(n-2);

因此总的情况为f(n)=f(n-1)+2*f(n-2);

注意也必须用__int64!!!

技术分享图片
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    __int64 s[55]={0,3,6,6};
    int n=0;
    for(int i=4;i<=50;i++)
    {
        s[i]=s[i-1]+2*s[i-2];
    }
    while(cin>>n)
        cout<<s[n]<<endl;
    return 0;
}
View Code

2046:思路:从图中也可以观察出来,第N张牌的排列可以又N-1张牌的排列再在末尾加上一张竖的牌。这样依然合法。
也可以在N-2张合法排列的牌后面加上两张横着放的牌(如果竖着放就和上面一种重复了)。
所以f(n) = f(n-1) + f(n-2)
即又是一个斐波那契数列。

注意:要用到__int64 ,没用这个AC不了。
技术分享图片
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    __int64 s[55]={1,1,2};//注意当s[0]=1
    int n=0;
    for(int i=3;i<=50;i++)
    {
        s[i]=s[i-1]+s[i-2];
    }
    while(cin>>n)
        cout<<s[n]<<endl;
    return 0;
}
View Code

2047:题意:给一个n,在这n个位置上面放 ‘E‘ ‘0‘ ‘F‘,这三个字符,问可以拼出多少不同的字符来,排除有‘0‘‘O‘相连的情况。

解题思路:(1)当n位取‘O‘的时候,那么n-1位就只能去‘E‘‘F‘这两种可能,对后面n-2之后的位置就没有任何的限定了,所以是1*2*f[n-2];

    (2)当n位去‘E‘‘F‘时,那么对于n-1位置没有任何的限定,所以情况是2*f[n-1]

综上所述:f[n]=2*(f[n-1]+f[n-2])

技术分享图片
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    __int64 s[55]={1,3,8};//注意当s[0]=1
    int n=0;
    for(int i=3;i<=50;i++)
    {
        s[i]=2*s[i-1]+2*s[i-2];
    }
    while(cin>>n)
        cout<<s[n]<<endl;
    return 0;
}
View Code

 

 




以上是关于hdu 2044(蜜蜂)2045(RPG难题)2046(骨牌铺方格)2047()的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2045 LELE的RPG难题(递推)

HDU 2045 不容易系列之—— LELE的RPG难题(递归/动态规划)

hdu 2045 不容易系列之—— LELE的RPG难题

HDU 2045 不容易系列之—— LELE的RPG难题

HDU 2045 不easy系列之—— LELE的RPG难题

HDU 2045不easy系列之三LELE的RPG难题(趋向于DP的递推)