hdu 递归/递推

头文件整理:
1、strlen 要用头文件cstring
2、scanf 要用头文件#include <stdio.h>

递归练习

  • hdu 1274
#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<cstring> 
using namespace std;
const int maxn = 255;
int n;
int len = 0;
char s[maxn];
int isdigit(char x){
	return (x >= '0') && (x <= '9') ;
}
int extend(int p){
	while((s[p] != ')')&&(p < len)){
		int k = 0;//k用来统计一共数字 
		while(isdigit(s[p])){
			k = k * 10 +  s[p ++]-'0';
		}
		if(k == 0){
			k = 1;
		}
		int x = -1;	
		while(k --){
			if(s[p] == '('){
				x = extend(p+1);
			}
			else{
				printf("%c",s[p]);
			}
		}
		if(x != -1){
			p = x;
		}
		p ++;
	}
	return p;
}
int main(){
	scanf("%d",&n);
	while(n --){
		scanf("%s",&s);
		len = strlen(s);
		extend(0);
		printf("\n");
	}
	return 0;
}
  • hdu2064
#include <iostream>
#include <stdio.h>
int num;
long long Hano(int x){
	if(x == 1){
		return 2;
	}
	else{
		return 3*Hano(x-1) + 2;
	}
}
int main(){
	while(scanf("%d",&num)!= EOF){
		long long  ans = Hano(num);
		printf("%lld\n",Hano(num));
	}
	return 0;
} 
  • lqb
    题目:
    描述:正则问题

考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。

例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。

输入

一个由x()|组成的正则表达式。输入长度不超过100,保证合法。

输出

这个正则表达式能接受的最长字符串的长度。

例如,
输入:
((xx|xxx)x|(x|xx))xx

程序应该输出:
6

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

#include<cstring>
#include<stdio.h>
const int maxn = 105;
char s[maxn];
int p = 0;
int len;
int countnum(){
	int ans = 0;
	int left = 0;
	int right = 0;
	int flag = 0;//flag = 0 表示在|左边,flag = 1表示在|右边 
	while(p < len){
		if(s[p] == '('){
			p ++;
			if(flag == 0){
				left += countnum();
			}
			else{
				right += countnum();
			}
		}
		else if(s[p] == '|'){
			flag = 1;
		}
		else if(s[p] == ')'){
			return (left > right)?left:right;
		}
		else if(s[p] == 'x'){
			if(flag == 0){		
				left ++;
			}
			else {
				right ++;
			}
		}
		p ++;
	}
	return (left > right)?left:right;
}
int main(){
	scanf("%s",&s);
	len = strlen(s);
	printf("%d\n",countnum());
	return 0;
} 
  • hdu 2013
    题目:第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
    输入:输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。
    输出:对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
#include<stdio.h>
int n;
int count(int d){
	if(d == 1){
		return 1;
	}
	else return 2*(count(d-1) + 1);
}
int main(){
	while(scanf("%d",&n) != EOF){
		printf("%d\n",count(n));
	}
	return 0;
	
}
  • hdu 2044
#include<stdio.h>
#include<cstring>
const int maxn = 55;
int n;
int a,b;
long long  graph[maxn];

int main(){
	memset(graph,0,sizeof(graph));
	graph[1] = 1;
	graph[2] = 2;
	for(int i = 3;i < maxn;i ++){
		graph[i] = graph[i-1] + graph[i-2];
	}
	scanf("%d",&n);
	while(n -- ){
		scanf("%d %d",&a,&b);
		printf("%lld\n",graph[b-a]);
	} 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值