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;
}

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;
}

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;
}

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;
}

时间: 2024-08-27 20:08:33

hdu 2044(蜜蜂)2045(RPG难题)2046(骨牌铺方格)2047()的相关文章

HDU 2046 骨牌铺方格(简单递推)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2046 骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 36089    Accepted Submission(s): 17535 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输

hdoj 2046 骨牌铺方格 【DP】+【斐波那契】

dp果然不是好学的... 第n个,即2*n时,可由第n-1个的竖直排列再加一个,和第n-2个中横着排两个 所以f(n) = 1×f(n-1) + 1×f(n-2): 骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28412    Accepted Submission(s): 13771 Problem Descripti

HDU 2046 骨牌铺方格(递推)

骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 42774    Accepted Submission(s): 20735 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Inpu

HDoj 2046 骨牌铺方格

Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Input 输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50). Output 对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行. Sample Input 1 3 2 Sample Output 1 3 2 Author lcy Source

(补题 杭电 2046)骨牌铺方格

骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 68313 Accepted Submission(s): 32884 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Input 输入数据由

骨牌铺方格(杭电2046)

骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30887    Accepted Submission(s): 14949 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Inpu

(hdu step 3.1.2)骨牌铺方格(简单递推:求用2*1的骨牌铺满2*n的网格的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: 骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 744 Accepted Submission(s): 478   Problem Descriptio

hdu 骨牌铺方格 (java)

问题: 递推,此类题应该仔细画出来其规律就会明朗起来,光靠想象很难算对. 为了保险用的double装的,int应该也能装. 骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 34969    Accepted Submission(s): 16979 Problem Description 在2×n的一个长方形方格中,用一个1

HDU2046 骨牌铺方格

问题链接:HDU2046 骨牌铺方格.入门训练题,用C语言编写程序. 这是一个典型的递推计算题. f(0) = 0,没有地方摆骨牌,所以为0: f(1) = 1,只能竖着摆放1个骨牌: f(2) = 2,可以是横着摆放2个骨牌,或者竖着摆放2个骨牌: f(n) = f(n-2) + f(n-1),n>2,可以在f(n-2)的基础上在右边再横着放2个骨牌(竖着放已经在f(n-1)中),也可以在f(n-1)的基础上在右边再竖着1个骨牌. AC程序如下: /* HDU2046 骨牌铺方格 */ #in