0x02 递推与递归
#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 ;
}
在前面的基础上加入以下代码即可:
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 ;
}
#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 递推与递归的更多相关文章
- NOIP2013提高问题求解T2(关于递推与递归)
同步发表于我的洛谷博客. NOIP2013提高问题求解2: 现有一只青蛙,初始时在n号荷叶上.当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,--,k号荷叶之一上,直到跳到第1号荷叶为止 ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- 【Luogu】【关卡2-12】递推与递归二分(2017年10月)
任务说明:递推,层层递进,由基础推向顶层.二分不仅可以用来查找数据,还可以确定最合适的值. P1192 台阶问题 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶 ...
- 再谈循环&迭代&回溯&递归&递推这些基本概念
循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...
- 「学习笔记」递推 & 递归
引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) ...
- 题解报告:hdu 2084 数塔(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...
- (acwing蓝桥杯c++AB组)1.2 递推
1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...
- 斐波那契数列 递归 尾递归 递推 C++实现
==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...
- 百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】
总Time Limit: 10000ms Memory Limit: 65536kB 有一个奇妙的口袋.总的容积是40,用这个口袋能够变出一些物品,这些物品的整体积必须是40.John如今有n个 ...
随机推荐
- HDU 5534:Partial Tree(完全背包)***
题目链接 题意 给出一个n个结点的树,给出n-1个度的权值f[],代表如果一个点的度数为i,那么它对于答案的贡献有f[i].问在这棵树最大的贡献能达到多少. 思路 对于这个图,有n*2-2个度可以分配 ...
- 利用Python模拟GitHub登录
最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fiddler抓包分析 首先,我们想要模拟一 ...
- I/O:FileLock
FileLock: /* 文件锁定要么是独占的,要么是共享的.共享锁定可阻止其他并发运行的程序获取重叠的 独占锁定,但是允许该程序获取重叠的共享锁定.独占锁定则阻止其他程序获取任一类型的重叠锁 定.一 ...
- 【动态规划法(DP)】-C++
360百科定义: 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bell ...
- Excel公式中问题-记住不要忽略空格!
总结一下之前犯得愚蠢的小问题: 程序:每日报表:从DB下载数据填充到excel,包括3个sheet,sheet1:总结<模板,公式填充,数据源为sheet2,sheet3>;sheet2: ...
- android值类型转换
各种数字类型转换成字符串型: String s = String.valueOf( value); // 其中 value 为任意一种数字类型. 字符串型转换成各种数字类型: String s = & ...
- SpringBoot2.1.6 + Shiro1.4.1 + Thymeleaf + Jpa整合练习
首先,添加maven依赖,完整的pom文件如下: <?xml version="1.0" encoding="UTF-8"?> <projec ...
- mpvue的使用,包含axios、router的集成等完美结合小程序
mpvue开发微信小程序框架的使用注意事项: 1.路由跳转,引用mpvue-router-patch 在main.js文件中引入控件:import MpvueRouterPatch from 'mpv ...
- 上车时机已到--.NETCore是适应时代发展的雄鹰利剑
上车时机已到--.NETCore是适应时代发展的雄鹰利剑 要起飞了 .NET Core 3.0-prevew7:https://dotnet.microsoft.com/download/dotnet ...
- Redis 学习笔记(篇六):数据库
Redis 是一个使用 C 语言编写的 NoSql 的数据库,本篇就讲解在 Redis 中数据库是如何存储的?以及和数据库有关的一些操作. Redis 中的所有数据库都保存在 redis.h/redi ...