Description

由于长期缺乏运动,小黑发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥。 
小黑买来一块圆形的毯子,把它们分成三等分,分别标上A,B,C,称之为“跳舞毯”,他的运动方式是每次都从A开始跳,每次都可以任意跳到其他块,但最后必须跳回A,且不能原地跳.为达到减肥效果,小黑每天都会坚持跳n次,有天他突然想知道当他跳n次时共几种跳法,结果想了好几天没想出来-_- 
现在就请你帮帮他,算出总共有多少跳法。 
 

Input

测试输入包含若干测试用例。每个测试用例占一行,表示n的值(1<=n<=1000)。 
当n为0时输入结束。 
 

Output

每个测试用例的输出占一行,由于跳法非常多,输出其对10000取模的结果.
 

Sample Input

2
3
4
0
 

Sample Output

2
2
6
 
1.DFS得出结果,找规律

#include <iostream>
#include "cstdio"
using namespace std;
#define MOD 10000
int n,cnt;
int dfs(char c,int k)
{
if(k==n+)
{
if(c=='A')
cnt++;
return cnt%MOD;
}
if(c=='A'){
dfs('B',k+);
dfs('C',k+);
}
else if(c=='B'){
dfs('A',k+);
dfs('C',k+);
}
else if(c=='C'){
dfs('B',k+);
dfs('A',k+);
}
}
int main()
{
//freopen("out.txt","w",stdout);
int ans=;
for(n=;n<;n++){
cnt=;
cout<<n<<" "<<dfs('A',)<<endl;
}
return ;
}

观察数据找到规律:

if(i%2==0)

a[i]=2*a[i-1]+2;

else a[i]=2*a[i-1]-2;

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i,n,step[]={,,,};
for(i=; i<; i++)//打表
{
if(i%==)
step[i]=*step[i-]+;
else
step[i]=*step[i-]-;
step[i]=step[i]%;
}
while(scanf("%d",&n)&&n!=)
{
printf("%d\n",step[n]%);
}
return ;
}

参考:http://blog.csdn.net/castledrv/article/details/46897311

 2.递推式f[i]=2^(i-1)-f[i-1]      进一步推出f[i]=2^(i-2)+f[i-2]   

含义:

A_A    B | C  2

A__A  BC | CB  2  

A___A  BAB | CAC | BCB | CBC | BAC | CAB  2

即后四个空全排列-以A结尾的排列数

f[i]=2^(i-1)-f[i-1]  

f[i-1]=2^(i-2)-f[i-2]

->

f[i]=2^(i-2)+f[i-2]

#include<iostream>
using namespace std;
#define mod 10000
int main()
{
int a[] = { ,,, };
int n; int k = ;
for (int i = ; i < ; i++)///打表
{
a[i] = (k%mod + a[i - ] % mod) % mod;
k = k * % mod;
}
while (cin >> n&&n)
{
cout << a[n] << endl;
}
return ;
}

参考:http://www.cnblogs.com/dream-wind/archive/2012/03/16/2400596.html

3.DP

dp[i][j]

j=1表示第i步红色的步数

j=2表示第i步在黄色的步数

j=3表示第i步在蓝色的步数

对于每次跳到红色的状态有:第i-1必须是在蓝色和黄色的地板上

所以dp[i][1]=dp[i-1][2]+dp[i-1][3];

第i步黄色也有dp[i][2]=dp[i-1][1]+dp[i-1][3];

第i步蓝色有dp[i][3]=dp[i-1][1]+dp[i-1][2];

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int dp[][];
int main()
{
dp[][]=;int i;
dp[][]=;dp[][]=;
for(i=;i<=;i++)
{
dp[i][]=dp[i-][]+dp[i-][];
dp[i][]=dp[i-][]+dp[i-][];
dp[i][]=dp[i-][]+dp[i-][];
dp[i][]=dp[i][]%;
dp[i][]=dp[i][]%;
dp[i][]=dp[i][]%;
}
int n;
while(scanf("%d",&n)&&n)
{
printf("%d\n",dp[n][]);
}
return ;
}

参考:http://www.voidcn.com/article/p-pkzamxse-et.html

HDU 2154 跳舞毯 | DP | 递推 | 规律的更多相关文章

  1. hdu 2604 Queuing(dp递推)

    昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...

  2. HDU 5860 Death Sequence(递推)

    HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...

  3. HDU 2085 核反应堆 --- 简单递推

    HDU 2085 核反应堆 /* HDU 2085 核反应堆 --- 简单递推 */ #include <cstdio> ; long long a[N], b[N]; //a表示高能质点 ...

  4. hdu2089(数位DP 递推形式)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu 1723 DP/递推

    题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...

  6. HDU 5366 dp 递推

    The mook jong Accepts: 506 Submissions: 1281 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...

  7. HDU 3469 Catching the Thief (博弈 + DP递推)

    Catching the Thief Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. hdu 2050 折线分割平面 dp递推 *

    折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. HDU 6076 Security Check DP递推优化

    Security Check Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

随机推荐

  1. No Route to Host from master/192.168.2.131 to master:9000 failed on socket t

    host里边添加的ip地址与当前的ip地址(ifconfig可以查看)不一致,修改当前ip地址就可以了.

  2. Python 再谈字符串

    字符串除了要用引号来创建之外,其他和元组一样,不能修改,如果要修改只能用切片或者拼接的方式. 其他的什么乱七八糟的运算符都一样 一些不同 capitalize()-将字符串的第一个字母大写 str1. ...

  3. 向redis插入数据时,返回值问题

    向redis插入数据时,如果redis没有要插入的key,插入成功之后返回值为1 如果redis有这个key,插入成功之后返回值是0

  4. ACM 第十八天

    数学基础(卷积,FFT,FWT,FMT,鸽巢原理,群论,哈里亚余数,哈里亚计数定理,组合数学,LVG定理,期望DP,期望点贡献问题) 练习题: A - Necklace of Beads Beads ...

  5. 解决ueditor编辑器图片在线管理图片无法显示

    使用ueditor,点击在线管理,服务器图片路径显示不正确,如下图所示  查看源码,如下:  发现图片src中中间多了一长串的项目跟路径,解决的办法是 把  jsp/controller.jsp 里面 ...

  6. 好记性不如烂笔头之Maven使用小记

    一.前言 说起Maven,是在我上上东家接触的,掌握的还不错,因为种种原因,上家公司没有使用太多大众技术,我也没有太多施展的机会,对于以前掌握的技术,很多都荒废了,最近使用起来发现有点儿吃力了,为了加 ...

  7. VBA练习-打开文件,添加选中项,生成新表

    学习VBA,正好给财务制作一个小工具: Sub 打开人员信息表() Dim wb As Workbook, c As Integer Set wb = Workbooks.Open(, True) c ...

  8. 【Python】Python time mktime()方法

    描述 Python time mktime() 函数执行与gmtime(), localtime()相反的操作,它接收struct_time对象作为参数,返回用秒数来表示时间的浮点数. 如果输入的值不 ...

  9. Go语言【第五篇】:Go条件语句

    Go语言条件 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为true来决定是否执行指定语句,并在条件为false的情况再执行另外的语句.下图展示了程序语言中条件语句的结构: Go语言提 ...

  10. BZOJ4028 HEOI2015公约数数列(分块)

    前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd. 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改.于是考虑分块. 对于每一块将 ...