热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hihocoder1680hiho字符串2dp求方案数+递归

我们定义第一代hiho字符串是hiho。第N代hiho字符串是由第N-1代hiho字符串变化得到,规则是:h-hioi-hio-ho例如第二代

我们定义第一代hiho字符串是"hiho"。  

第N代hiho字符串是由第N-1代hiho字符串变化得到,规则是:

h -> hio  

i -> hi  

o -> ho  

例如第二代hiho字符串是: hiohihioho  

第三代是: hiohihohiohihiohihohioho  

给定N和K,请你计算第N代hiho字符串中的第K个字符是什么。

Input

第一行包含一个整数T,代表测试数据的组数。 (1 ≤ T ≤ 10)  

以下T行每行包含两个整数N和K。  

对于50%的数据,每一组的N都满足 1 ≤ N ≤ 15  

对于100%的数据, 1 ≤ N ≤ 100, 1 ≤ K ≤ 1000000000

Output

对于每组数据,输出一行,包含一个字符代表答案。

Sample Input

3
1 1
2 5
3 7

Sample Output

h
i
o





大意:初始字符串为hiho,一轮过后,h变为hio,i变成hi,o变成ho
问N轮过后字符串中第K个字符是什么。


题解:f[j][i]代表第 j 种字符经过 i-1 轮变换后变成了多少字符。(j==1代表 h ,j==2 代表 i ,j==3代表 o)
然后划分第N轮的字符,确定第K个在哪部分,然后进入第N-1轮,继续划分……很明显的递归性质。

1 /*
2 Welcome Hacking
3 Wish You High Rating
4 */
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include<string>
13 using namespace std;
14 int read(){
15 int xx&#61;0,ff&#61;1;char ch&#61;getchar();
16 while(ch>&#39;9&#39;||ch<&#39;0&#39;){if(ch&#61;&#61;&#39;-&#39;)ff&#61;-1;ch&#61;getchar();}
17 while(ch>&#61;&#39;0&#39;&&ch<&#61;&#39;9&#39;){xx&#61;(xx<<3)&#43;(xx<<1)&#43;ch-&#39;0&#39;;ch&#61;getchar();}
18 return xx*ff;
19 }
20 const int limit&#61;1000000000;
21 int T,N,K;
22 long long f[4][110];//h:1 i:2 o:3
23 void dfs(int arg,int depth,int sum){
24 if(depth&#61;&#61;1){
25 if(arg&#61;&#61;1)
26 printf("h\n");
27 else if(arg&#61;&#61;2)
28 printf("i\n");
29 else
30 printf("o\n");
31 return;
32 }
33 if(arg&#61;&#61;1){
34 if(sum<&#61;f[1][depth-1])
35 dfs(1,depth-1,sum);
36 else{
37 sum-&#61;f[1][depth-1];
38 if(sum<&#61;f[2][depth-1])
39 dfs(2,depth-1,sum);
40 else{
41 sum-&#61;f[2][depth-1];
42 dfs(3,depth-1,sum);
43 }
44 }
45 }
46 else if(arg&#61;&#61;2){
47 if(sum<&#61;f[1][depth-1])
48 dfs(1,depth-1,sum);
49 else{
50 sum-&#61;f[1][depth-1];
51 dfs(2,depth-1,sum);
52 }
53 }
54 else{
55 if(sum<&#61;f[1][depth-1])
56 dfs(1,depth-1,sum);
57 else{
58 sum-&#61;f[1][depth-1];
59 dfs(3,depth-1,sum);
60 }
61 }
62 }
63 int main(){
64 //freopen("in","r",stdin);
65 //freopen("out","w",stdout);
66 for(int i&#61;1;i<&#61;3;i&#43;&#43;)
67 f[i][1]&#61;1;
68 for(int i&#61;2;i<&#61;100;i&#43;&#43;){
69 f[1][i]&#61;f[1][i-1]&#43;f[2][i-1]&#43;f[3][i-1];
70 f[2][i]&#61;f[1][i-1]&#43;f[2][i-1];
71 f[3][i]&#61;f[1][i-1]&#43;f[3][i-1];
72 for(int j&#61;1;j<&#61;3;j&#43;&#43;)
73 if(f[j][i]>limit)
74 f[j][i]&#61;limit&#43;1;
75 }
76 T&#61;read();
77 while(T--){
78 N&#61;read(),K&#61;read();
79 if(K<&#61;f[1][N])
80 dfs(1,N,K);
81 else{
82 K-&#61;f[1][N];
83 if(K<&#61;f[2][N])
84 dfs(2,N,K);
85 else{
86 K-&#61;f[2][N];
87 if(K<&#61;f[1][N])
88 dfs(1,N,K);
89 else{
90 K-&#61;f[1][N];
91 dfs(3,N,K);
92 }
93 }
94 }
95 }
96 return 0;
97 }

View Code

 







转:https://www.cnblogs.com/lzhAFO/p/8253648.html



推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
豬仔珊珊_114
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有