NBUT 1028 该减肥了(简单递推)

Posted Blackops

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NBUT 1028 该减肥了(简单递推)相关的知识,希望对你有一定的参考价值。

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

以上是关于NBUT 1028 该减肥了(简单递推)的主要内容,如果未能解决你的问题,请参考以下文章

小黑跳地毯减肥(递推)

luogu 1028

HDU 2154 跳舞毯 | DP | 递推 | 规律

HDU 1028 Ignatius and the Princess III dp

1028:Ignatius and the Princess III

洛谷-----P1028 [NOIP2001 普及组] 数的计算