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. RDL/RDLC批量单据打印 [转]

    RDL/RDLC批量单据打印 使用RDL或RDLC进行单据打印时,单张单据打印比较直观简单,无需说明.下面我们来谈一下批量单据打印的实现方法.以下以RDL的ReportBuilder设计环境为例进行讲 ...

  2. android4.3 Bluetooth分析之扫描分析

    android4.3中引入了蓝牙低能耗le(low energy),相应的也有一些方法/类.不过代码里,并没有找到初始调用的地方.所以这里还是先只分析下bt普通的扫描流程(类似android 4.2) ...

  3. NFC学习总结二

    移动支付这事情热了总归还是会回归理性,就如同之前的10几年间的几次轮回一样.字面上看,移动支付比支付大也不大可能,有相同,有扩展,有交集有不通才是. NFC这事情也是说了快十年了,真心希望它能回归到其 ...

  4. FZU.Software Engineering1816 · First Homework -Preparation

    Introduction 041602204 : 我是喜欢狗狗(particularly Corgi & Shiba Inu.)的丁水源 : 我的爱好是音乐.电影.英语(100%!!!!).吉 ...

  5. java---StringBuilder类的用法(转载)

    转载自http://blog.csdn.net/zi_jun/article/details/7624999 String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在 ...

  6. java的参数传递

    1按值传递:传递的是原始值的副本,而不是原始值的内存地址 基本数据类型是传原始值的副本 class Test02 { public static void main(String[] args) { ...

  7. BAT批处理(三)

    1.set set命令:显示.设置或删除变量.显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值.设置变量:set aa=abcd 此句命令便可 ...

  8. (转)Linux NUMA引发的性能问题

    最近某客户的核心业务系统又出了翻译缓慢的情况.该问题在6月份也出现过,当时进行了一次调整. 我们首先来看下故障时间段的awr报告: 单纯的从TOP 5 event,基本上是看不出任何东西的,可能有人会 ...

  9. query 获取本身的HTML

    <div class="test"><p>hello,你好!</p></div> <script> $(".t ...

  10. POJ 2785 4 Values whose Sum is 0(折半枚举)

    给出四个长度为n的数列a,b,c,d,求从这四个数列中每个选取一个元素后的和为0的方法数.n<=4000,abs(val)<=2^28. 考虑直接暴力,复杂度O(n^4).显然超时. # ...