dfs+search
1.数的划分
点击查看搜索
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,a[100];
void dfs(int x,int y,int z)//shu zong wei
{
if(y>n)return;
if(y==n)
{
for(int i=1;i<z;i++)//不取等
{
printf("%d ",a[i]);
}
printf("\n");
return;
}
for(int i=x;i<n;i++)
{
a[z]=i;
dfs(i,y+i,z+1);
}
}
int main()
{
scanf("%d",&n);
dfs(1,0,1);
return 0;
}
点击查看递推
/*把n看成是n个小球,k看成是k个盒子
那么题目就变成了把n小球放到k个盒子,且每个盒子都至少有1个小球的问题。
那么把n个小球放到k个盒子里的情况总数 = 1.至少有1个盒子放1个小球的情况总数 + 2.每个盒子都有多于1个小球的情况总数
那么这里 1 相当于 把n-1个小球放到k-1个盒子里的情况总数
2 相当于 把n-k个小球放到k个盒子里的情况总数
到了这里就可以发现是递推咯。
公式为 f(n,k) = f(n-1,k-1) + f(n-k,k)
*/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n, k, f[205][10];
int main() {
scanf("%d%d", &n, &k);//不太一样,划分成k个数
for (int i = 1; i <= n; i++) {
f[i][1] = 1;
}
for (int i = 2; i <= k; i++) {
f[i][i] = 1;
for (int j = i + 1; j <= n; j++) {
f[j][i] += f[j - 1][i - 1] + f[j - i][i];
}
}
printf("%d", f[n][k]);
return 0;
}
2.组合数的输出
点击查看代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,a[100];
bool b[100];
void print()
{
for(int i=1;i<=m;i++)printf("%d ",a[i]);
printf("\n");
return;
}
int dfs(int x,int y)
{
if(y>m) print();
else
{
for(int i=x;i<=n;i++)
{
a[y]=i;
dfs(i+1,y+1);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
dfs(1,1);
return 0;
}
3.拔河比赛
详见Ybtoj
当然重点在于搜索都配有板子了
点击查看1
int search(int k)
{
for(int i=1;i<=n;i++)
{
if()//合法
{
//保存
if()//终点
{
ans++;
print();
}
else search(++k);
}
//恢复(回溯)
}
}
点击查看2
int search(int k)
{
if()//
{
ans++;
print();
}
else for(int i=1;i<=n;i++)
{
if()
{
//
search(++k);
//
}
}
}
注意场宽 && STL大法好
题目描述
第一行:n
第二行:n个字符(有重复)
输出:全排列+方案数
思路:把单一的 vis[i] 换为累加器数组
STL大法好
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string.h>
#include<algorithm>
int n;
char s[30];
int main()
{
long long ans = 0;
scanf("%d",&n);
scanf("%s",s+1);
std::sort(s+1,s+n+1);
do{
for(int i=1;i<=n;i++) printf("%c",s[i]);
printf("\n");
++ans;
}while(std::next_permutation(s+1,s+n+1));
printf("%lld\n", ans);
return 0;
}
正解
#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string.h>
using namespace std;
int n , ans = 0;
char s[100];
bool same( int t, int k) {
for(int i = t; i < k; ++i) {
if(s[k] == s[i]){
return 0;
}
}
return 1;
}
void print()
{
for(int i = 0; i < n; i++) {
printf("%c",s[i]);
}
printf("\n");
}
void dfs(int t) {
if(t == n-1) {
print();
ans++;
}
for(int i = t; i < n; ++i){
if(same(t, i)) {
swap(s[i], s[t]);
dfs( t + 1 );
swap(s[i], s[t]);
}
}
}
int main() {
scanf("%d",&n);
cin >> s;
dfs( 0);
printf("%d",ans);
return 0;
}
//数组尽量开大一点
dfs+search的更多相关文章
- 1923. Scary Politics (timus) (dfs) search
http://acm.timus.ru/problem.aspx?space=1&num=1923 -- timus This is s problem about thd dfs and s ...
- Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy
1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputin ...
- [LeetCode#212]Word Search II
Problem: Given a 2D board and a list of words from the dictionary, find all words in the board. Each ...
- Leetcode: Android Unlock Patterns
Given an Android 3x3 key ≤ m ≤ n ≤ , count the total number of unlock patterns of the Android lock s ...
- PE刷题记录
PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...
- Android Unlock Patterns
Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...
- Trie for string LeetCode
Trie build and search class TrieNode { public: TrieNode * next[]; bool is_word; TrieNode(bool b = fa ...
- 582. Kill Process
Problem statement: Given n processes, each process has a unique PID (process id) and its PPID (paren ...
- Leetcode: Closest Leaf in a Binary Tree
Given a binary tree where every node has a unique value, and a target key k, find the value of the n ...
随机推荐
- centos8 yum安装nginx后启动不了nginx
起动报下列错误 移动到安装目录下起动报下列错误,说是端口被占用 输入journalctl -xe命令查看,发现如下: 这个是一个什么错误,度娘一下SElinux 输入sestatus查看下SElinu ...
- win10 配置maven
1.官网下载后,解压到需要的文件夹 2.进入文件夹,获取根目录的路径 3.配置环境变量 两个都要 M2_HOME MAVEN_HOME 3.配置path ,以相对路径的方式配置bin目录 4.测试是否 ...
- SpringBoot学习笔记四之后台登录页面的实现
注:图片如果损坏,点击文章链接: https://www.toutiao.com/i6803542216150090252/ 继续之前完成的内容,首先创建一个常量类 常量类的内容 服务器端渲染 前后端 ...
- 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)
邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...
- JPA与hibernate-------JPA01
ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数据库 ...
- 【一个小实验】腾讯云的redis的主从结构的特性
使用腾讯云上的redis,可以添加多个备机的分片,并且可以选择不同的账号来设定主从读写的策略. 现在设置两个账号:primary-主节点写,主节点读:secondary-主节点写,从节点读. 研究出了 ...
- Kubernetes 微服务最佳实践
本文由个人笔记 ryan4yin/knowledge 整理而来 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes 配置」,是我个人的「最佳实践」. 其中大部 ...
- linux正则转换csv文件
- Ventoy的UEFI模式安全启动操作说明
Ventoy 1.0.07 版本开始支持 Secure Boot (安全启动),但是这个方案不是非常的完美,会导致在一些机器上不管BIOS里安全启动是否关闭都不能正常工作.因此从 1.0.09 版本开 ...
- 幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同
幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同