【例题】CH0301 递归实现指数型枚举

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n;
vector<int> chosen;
void calc(int x) {
if (x==n+) {
for (int i=; i<chosen.size(); ++i)
printf("%d ", chosen[i]);
cout<<endl;
return;
}
calc(x+);
chosen.push_back(x);
calc(x+);
chosen.pop_back();
}
int main() {
cin>>n;
calc();
return ;
}

【例题】CH0302 递归实现组合型枚举

在前面的基础上加入以下代码即可:

if (chosen.size()>m||chosen.size()+(n-x+)<m)
return;
 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n, m;
vector<int> chosen;
void calc(int x) {
if (chosen.size()>m||chosen.size()+(n-x+)<m)
return;
if (x==n+) {
for (int i=; i<chosen.size(); ++i)
printf("%d ", chosen[i]);
cout<<endl;
return;
}
chosen.push_back(x);
calc(x+);
chosen.pop_back();
calc(x+);
}
int main() {
cin>>n>>m;
calc();
return ;
}

【例题】CH0303 递归实现排列型枚举

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n;
int order[];
int chosen[];
void calc(int k) {
if (k==n+) {
for (int i=; i<=n; ++i)
printf("%d ", order[i]);
puts("");
return;
}
for (int i=; i<=n; ++i) {
if (chosen[i]) continue;
order[k]=i;
chosen[i]=;
calc(k+);
order[k]=;
chosen[i]=;
}
}
int main() {
cin>>n;
calc();
return ;
}

【例题】费解的开关

容易发现3个性质:

1.每个位置最多点击一次

2.固定了第一行,满足题意的点击方案只有一种,如第i行已被固定,第i位为1,则第i+1行该位置需要被点击

3.点击先后顺序不影响最终结果

所以用位运算枚举第一行的点击方案,再递推出2~5行的点击,最后判断第5行是否满足题意即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int g[][];
char nex[][]={{,},{,-},{-,},{,},{,}}; void turn(int x, int y) {
for (int i=; i<; ++i) {
int tx=x+nex[i][];
int ty=y+nex[i][];
if (tx>&&tx<=&&ty>&&ty<=)
g[tx][ty]^=;
}
} void print() {
/*for (int i=1; i<=5; ++i) {
for (int j=1; j<=5; ++j)
printf("%1d", g[i][j]);
printf("\n");
}
puts("");*/
} int solve() {
int ans=0x3f3f3f3f;
for (int i=; i<; ++i) {
int flag=, tot=;
int tmp[][];
memcpy(tmp, g, sizeof(tmp));
for (int j=; j<; ++j)
if ((i>>j)&) //如果第j位为1,则第一排的第j位需要被按一下
{ turn(, j+); tot++; print();/*printf("a\n");*/}
for (int j=; j<; ++j) {
for (int k=; k<=; ++k)
if (g[j][k]==)
{ turn(j+, k); tot++; print();/*printf("b\n");*/}
}
for (int j=; j<=; ++j)
if (g[][j]==) flag=;
memcpy(g, tmp, sizeof(g));
if (flag) ans=min(ans, tot);
else continue;
}
if (ans>) return -;
return ans;
} int main() {
//freopen("1.txt", "w", stdout);
int T;
scanf("%d", &T);
while (T--) {
for (int i=; i<=; ++i)
for (int j=; j<=; ++j)
scanf("%1d", &g[i][j]);
printf("%d\n", solve());
}
return ;
}
/*
1
11101
11101
11110
11111
11111
*/

0x02 递推与递归的更多相关文章

  1. NOIP2013提高问题求解T2(关于递推与递归)

    同步发表于我的洛谷博客. NOIP2013提高问题求解2: 现有一只青蛙,初始时在n号荷叶上.当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,--,k号荷叶之一上,直到跳到第1号荷叶为止 ...

  2. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  3. 【Luogu】【关卡2-12】递推与递归二分(2017年10月)

    任务说明:递推,层层递进,由基础推向顶层.二分不仅可以用来查找数据,还可以确定最合适的值. P1192 台阶问题 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶 ...

  4. 再谈循环&迭代&回溯&递归&递推这些基本概念

    循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...

  5. 「学习笔记」递推 & 递归

    引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) ...

  6. 题解报告:hdu 2084 数塔(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...

  7. (acwing蓝桥杯c++AB组)1.2 递推

    1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...

  8. 斐波那契数列 递归 尾递归 递推 C++实现

    ==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...

  9. 百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】

    总Time Limit:  10000ms  Memory Limit:  65536kB 有一个奇妙的口袋.总的容积是40,用这个口袋能够变出一些物品,这些物品的整体积必须是40.John如今有n个 ...

随机推荐

  1. 常用的方法论-SMART

  2. 玲珑OJ 1083:XJT Love Digits(离线处理+哈希)

    http://www.ifrog.cc/acm/problem/1083 题意:比较好懂.注意答案的x不包含ax本身,所以才输出-1. 思路:离线处理.根据x排序,然后每次更新Hash[]数组就好了. ...

  3. H5学习笔记-应用缓存,Web worker,服务器发送事件

    ↑亮了 应用缓存用法 <!DOCTYPE HTML> <html manifest="demo.appcache"> <body> The co ...

  4. WeUI Picker组件 源代码分析

    前言 由于最近做的一个移动端项目需要使用到类似 WeUI Picker组件 的选择效果,  所以在这里来分析下 WeUI Picker 的实现逻辑.(weui.js项目地址) 之前也做过类似的组件, ...

  5. 影音播放器 Daum Potplayer v1.7.14804 美化便携版

    PotPlayer 是一款由世界老牌的著名多媒体影音播放器软件 KMPlayer 的原创作者姜龙喜先生进入韩国多音软件公司后开发的新一代多媒体播放器作品.前者的优势在于内置了功能强大的视频及音频解码器 ...

  6. MYSQL千万级别数据量迁移Elasticsearch5.6.1实战

    从关系型库中迁移数据算是比较常见的场景,这里借助两个工具来完成本次的数据迁移,考虑到数据量并不大(不足两千万),未采用snapshot快照的形式进行. Elasticsearch-jdbc,Githu ...

  7. 齐治运维堡垒机后台存在命令执行漏洞(CNVD-2019-17294)分析

    基本信息 引用:https://www.cnvd.org.cn/flaw/show/CNVD-2019-17294 补丁信息:该漏洞的修复补丁已于2019年6月25日发布.如果客户尚未修复该补丁,可联 ...

  8. 深入理解Java虚拟机一 阅读笔记

    xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 以下内容摘抄自 ...

  9. VUE v-for循环中每个item节点动态绑定不同函数方法

    一. 业务场景: 一个title 处 可能有 一个或多个按钮,  按钮对应不同的响应事件 二. 思路 : 按钮个数 根据传入的数据length 来循环渲染,  每条数据对应的事件名称 通过动态绑定 三 ...

  10. HDFS的HA(高可用)

    HDFS的HA(高可用) 概述 (1)实现高可用最关键的策略是[消除单点故障].HA 严格来说应该分成各个组件的 HA 机制:HDFS 的 HA 和 YARN 的 HA. (2)Hadoop2.0 之 ...