[1028] 该减肥了
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
由于长期缺乏运动,Teacher Xuan发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥。Teacher Xuan买来一块圆形的毯子,把它们分成三等分,分别标上A,B,C,称之为“跳舞毯”,他的运动方式是每次都从A开始跳,每次都可以任意跳到其他块,但最后必须跳回A,且不能原地跳.为达到减肥效果,Teacher Xuan每天都会坚持跳n次,有天他突然想知道当他跳n次时共几种跳法,结果想了好几天没想出来-_-。现在请你帮帮他,算出总共有多少跳法。
- 输入
- 测试输入包含若干测试用例。每个测试用例占一行,表示n的值(1<=n<=1000)。
当n为0时输入结束。 - 输出
- 每个测试用例的输出占一行,由于跳法非常多,输出其对10000取模的结果.
- 样例输入
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;
}