专题一:递推与递归

这篇具有很好参考价值的文章主要介绍了专题一:递推与递归。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

递归

专题一:递推与递归,算法基础,算法

 例题

 递归实现指数型枚举

从 1∼n这 n个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

输入一个整数 n。

输出格式

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。

对于没有选任何数的方案,输出空行。

各行(不同方案)之间的顺序任意。

数据范围

1≤n≤15

输入样例:
3
输出样例:

3
2
2 3
1
1 3
1 2
1 2 3

专题一:递推与递归,算法基础,算法

import java.util.*;
public class Main{
    static int N=16;
    static int n;
    static int []st=new int[N];    //表状态,0表示未考虑,1表示选,2表示不选
    static void df(int u){
        if(u>n){    //递归出口,输出选择的数
            for(int i=1;i<=n;i++){
                if(st[i]==1)
                    System.out.print(i+" ");
            }
            System.out.println();
            return ;
        }
        //也可不恢复现场
        st[u] =2;   //未选择,递归第一个选的分支
        df(u+1);
        st[u] =0;   //恢复现场
        
        st[u]=1;//第二个分支,选了
        df(u+1);
        st[u]=0;//恢复现场
    }
    
    public static void main(String[] args){
        Scanner scan =new Scanner(System.in);
        n=scan.nextInt(); 
        df(1);
        scan.close();
    }
}

 递归实现排列型枚举

把 1∼n 这 n个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 n。

输出格式

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1≤n≤9

输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

专题一:递推与递归,算法基础,算法

import java.util.*;
public class Main{
    static int N=10;
    static int[] st=new int[N];         //存放第u个位置放什么数
    static boolean[] use=new boolean[N];//表示是否选用了i
    static int n;
    public static void dfs(int u){
        if(u>n){                    //递归出口,表示u个位置都已存放数
            for(int i=1;i<=n;i++){
                System.out.print(st[i]+" ");
            }
            System.out.println();
            return ;
        }
        //枚举每个分支
        for(int i=1;i<=n;i++){
            if(!use[i]){    //如果数i没有用过
                st[u]=i;    //第u个位置放i
                use[i]=true;
                dfs(u+1);
                //恢复现场
                st[u]=0;    //第u个位置未选用i
                use[i]= false;
            }
        } 
    }
    
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        n=scan.nextInt();
        dfs(1);
        scan.close();
    }
}

时间复杂度:n*(1+n+n(n-1)+......+n!)<n*3n!

递归实现组合型枚举

从 1∼n这 n个整数中随机选出 m个,输出所有可能的选择方案。

 
输入格式

两个整数 n,m在同一行用空格隔开。

输出格式

按照从小到大的顺序输出所有方案,每行 11 个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

数据范围

n>0,
0≤m≤n,
n+(n−m)≤25

输入样例:
5 3
输出样例:
1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

专题一:递推与递归,算法基础,算法

import java.util.*;
public class Main{
    static int N=30;
    static int n,m;
    static int[] st=new int[N]; //存放选择的数
    public static void dfs(int u,int k){    //u表示位置。从k开始枚举
        if(m>u+n-k) return ;                       //剪枝优化,当m-u+1>n-k+1时
        if(u==m+1){                         //递归出口,u个位置都已有数
            for(int i=1;i<=m;i++){
                System.out.print(st[i]+" ");
            }
            System.out.println();
            return ;
        }
        for(int i=k;i<=n;i++){  //枚举
            st[u]=i;        //第u个位置存放i
            dfs(u+1,i+1);   //递归调用
            st[u]=0;        //第u个位置不存放i,恢复现场
        }
    }
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        n=scan.nextInt();
        m=scan.nextInt();
        dfs(1,1);
        scan.close();
    }
}

专题一:递推与递归,算法基础,算法

带分数 

题目描述:


100 可以表示为带分数的形式:100=3+69258714
还可以表示为:100=82+3546197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。

输入格式

一个正数

输出格式


输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。

数据范围

1≤N<106
1

输出样例


输入样例1:

100
1
输出样例1:

11
1
输入样例2:

105
1
输出样例2:

6

专题一:递推与递归,算法基础,算法

 费解的开关

你玩过“拉灯”游戏吗?

25盏灯排成一个 5×5的方形。

每一个灯都有一个开关,游戏者可以改变它的状态。

每一步,游戏者可以改变某一个灯的状态。

游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。

我们用数字 1表示一盏开着的灯,用数字 0表示关着的灯。

下面这种状态

10111
01101
10111
10000
11011

在改变了最左上角的灯的状态后将变成:

01111
11101
10111
10000
11011

再改变它正中间的灯后状态将变成:

01111
11001
11001
10100
11011

给定一些游戏的初始状态,编写程序判断游戏者是否可能在 66 步以内使所有的灯都变亮。

输入格式

第一行输入正整数 n,代表数据中共有 n个待解决的游戏初始状态。

以下若干行数据分为 n 组,每组数据有 5行,每行 5 个字符。

每组数据描述了一个游戏的初始状态。

各组数据间用一个空行分隔。

输出格式

一共输出 n 行数据,每行有一个小于等于 6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。

对于某一个游戏初始状态,若 6 步以内无法使所有灯变亮,则输出 −1。

数据范围

0<n≤500

输入样例:
3
00111
01011
10001
11010
11100

11101
11101
11110
11111
11111

01111
11111
11111
11111
11111

输出样例:

3
2
-1
 思路:

1.第一行的操作确定,则整个操作确定,枚举对第一行共32种操作,对第一行的操作是解题的精髓,

2.对第2,3,4行的操作要根据其前一行的状态进行

3.检查最后一行是否符合状态文章来源地址https://www.toymoban.com/news/detail-773982.html

import java.util.*;
public class Main{
	static int[][] g=new int[5][5];
	static int[][] st=new int[5][5];
	static int ans=Integer.MAX_VALUE;
	static int[] dx= {0,0,1,0,-1},dy= {0,-1,0,1,0};	//原地,左下右上
	static void turn(int x,int y) {
		for(int i=0;i<5;i++) {
			int a=x+dx[i],b=y+dy[i];
			if(a>=0&&b>=0&&a<5&&b<5) {		//控制边界
				st[a][b] ^=1;
			}
		}
	}
	static int work() {
	    //对第一行一共有32次操作
		for(int l=0;l<32;l++) {		
		    int step=0;
			for(int i=0;i<5;i++) {
				st[i]=Arrays.copyOf(g[i], g[i].length);
			}
			
			//操作第一行
			for(int i=0;i<5;i++) {
				if((l >> i&1)==1) {	//如果l对应的二进制数为1,表明要对这个灯进行一次按灯操作,否则就是不操作,从而枚举32种情况
					turn(0,i);
					step++;
				}
			}
			//对2,3,4行进行操作
			for(int i=0;i<4;i++) {	
				for(int j=0;j<5;j++) {
					if(st[i][j]==0) {
						turn(i+1,j);
						step++;
					}
				}
			}
            //判断最后一行			
			boolean succes=true;
			for(int i=0;i<5;i++) {
				if(st[4][i]==0) {	//最后一行若有不亮的,返回false
					succes=false;
					break;
				}
			}
			if(succes) {
				ans=Math.min(ans, step);
			}
		}
    //操作完返回 		
		if(ans<=6) {
			return ans;
		}else {
			return -1;
		}
	}
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        for(int i=0;i<n;i++) {
            
        	for(int j=0;j<5;j++) {
        	    String s=scan.next();
        		for(int k=0;k<5;k++)
        			g[j][k]=s.charAt(k) - '0';
        	}
        	int a=work();
        	System.out.println(a);
        	ans=10;
        }
        scan.close();
    }
}

到了这里,关于专题一:递推与递归的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

    1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解, 然后综合各个小问题,得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次求解,而需要使用重复结构

    2024年02月08日
    浏览(45)
  • 递归、搜索与回溯算法(专题一:递归)

    往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 接下来我会用几道题,来让同学们利用我在专题零中提到的 递归的宏观思想 来解决这些题目。 目录 1. 汉诺

    2024年01月25日
    浏览(44)
  • 【算法专题】递归算法

    在解决⼀个规模为 n 的问题时,如果满足以下条件,我们可以使用递归来解决: 问题可以被划分为规模更小的子问题,并且这些子问题具有与原问题相同的解决⽅法。 当我们知道规模更小的子问题(规模为 n - 1)的解时,我们可以直接计算出规模为 n 的问题的解。 存在⼀种

    2024年02月03日
    浏览(39)
  • 递归、搜索与回溯算法(专题二:深搜)

    往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 (2)递归、搜索与回溯算法(专题一:递归)-CSDN博客  深搜是实现递归的一种方式,接下来我们之间从题

    2024年01月20日
    浏览(81)
  • 递归、搜索与回溯算法(专题六:记忆化搜索)

    目录 1. 什么是记忆化搜索(例子:斐波那契数) 1.1 解法一:递归 1.2 解法二:记忆化搜索 1.2.1 记忆化搜索比递归多了什么? 1.2.2 提出一个问题:什么时候要使用记忆化搜索呢? 1.3 解法三:动态规划 1.3.1 先复习一下动态规划的核心步骤(5个),并将动态规划的每一步对应

    2024年01月20日
    浏览(49)
  • 递归与递推

                                                       递归与递推 递推: 一般而言,递推是一种顺序递推的数学关系模型,好比通项公式。在数值计算的过程之中,只需要知道递推的边界值,也就是最开始的原始数值,比如斐波那契数中的第一个数值1和

    2024年02月05日
    浏览(42)
  • 【C++】递归,搜索与回溯算法入门介绍和专题一讲解

    个人主页:🍝在肯德基吃麻辣烫 我的gitee:C++仓库 个人专栏:C++专栏 从本文开始进入递归,搜索与回溯算法专题讲解。 递归就是函数自己调用自己。 递归的本质是: 主问题:—相同的子问题 子问题:—相同的子问题 通过: 1)通过递归的细节展开图(前期可以,过了前期

    2024年02月09日
    浏览(37)
  • 蓝桥杯---第一讲 递归与递推

    本篇博客主要打卡记录博主学习蓝桥杯C++AB组辅导课的习题第一章节的题目。 这一道题主要考查 dfs 算法,然后这一道题就是以位置来进行 搜索 当搜索到最后一个位置的时候就可以 收获结果 然后考虑枚举到的位置 可以选择 选 或者 不选 这一道题目 就是枚举每一个位置,然

    2024年02月08日
    浏览(38)
  • LeetCode 0746. 使用最小花费爬楼梯:动态规划(原地)——不用什么从递归到递推

    力扣题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/ 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼

    2024年02月03日
    浏览(41)
  • 专题一:递归【递归、搜索、回溯】

    什么是递归 函数自己调用自己的情况。 为什么要用递归 主问题-子问题        子问题-子问题 宏观看待递归 不要在意细节展开图,把函数当成一个黑盒,相信这个黑盒一定能完成任务。  如何写好递归   分析跟上一题差不多,不详解。 实现 pow(x, n) ,即计算  x  的整

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包