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; }
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)
即又是一个斐波那契数列。
#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; }
以上是关于hdu 2044(蜜蜂)2045(RPG难题)2046(骨牌铺方格)2047()的主要内容,如果未能解决你的问题,请参考以下文章
HDU 2045 不容易系列之—— LELE的RPG难题(递归/动态规划)