标签:
由于长期缺乏运动,Teacher Xuan发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥。Teacher Xuan买来一块圆形的毯子,把它们分成三等分,分别标上A,B,C,称之为“跳舞毯”,他的运动方式是每次都从A开始跳,每次都可以任意跳到其他块,但最后必须跳回A,且不能原地跳.为达到减肥效果,Teacher Xuan每天都会坚持跳n次,有天他突然想知道当他跳n次时共几种跳法,结果想了好几天没想出来-_-。现在请你帮帮他,算出总共有多少跳法。
2 3 4 0
2 2 6
题目链接:NBUT 1028
用dp[i][k]表示跳i下到第k种垫子的数量,显然一开始跳一下可以到B或C因此dp[1][B]=dp[1][C]=1,由于不能原地跳,dp[1][A]=0,然后就可以递推了,
代码中用enum方便理解
代码:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<bitset> #include<cstdio> #include<string> #include<deque> #include<stack> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define INF 0x3f3f3f3f #define CLR(x,y) memset(x,y,sizeof(x)) #define LC(x) (x<<1) #define RC(x) ((x<<1)+1) #define MID(x,y) ((x+y)>>1) typedef pair<int,int> pii; typedef long long LL; const double PI=acos(-1.0); const int N=1005; const int mod=10000; int dp[N][3]; enum {A,B,C}; void init() { CLR(dp,0); dp[1][B]=1; dp[1][C]=1; } int main(void) { int n,i,j,k; init(); for (i=2; i<N; ++i) { dp[i][B]=(dp[i-1][A]+dp[i-1][C])%mod; dp[i][C]=(dp[i-1][A]+dp[i-1][B])%mod; dp[i][A]=(dp[i-1][B]+dp[i-1][C])%mod; } while (~scanf("%d",&n)&&n) printf("%d\n",dp[n][A]); return 0; }
标签:
原文地址:http://www.cnblogs.com/Blackops/p/5809804.html