c++分治

分治

1. 概念

分而治之,就是分治
分治算法的本质其实就是将一个问题分解为若干个规模较小的相同(相似)子问题,不断解决
这个思维导图看得够清楚了
可以采用分治解决的问题需要满足的条件(特征):
①原问题规模较大,不易直接解决,若是缩小到一定程度就能容易解决
②原问题可以分解为若干个规模较小,求解方式相同(相似)的子问题,且子问题之间的求解是互不影响的
③合并原问题分解的子问题的解可以得到原问题的解
话不多说,直接上例题~

2. 例题

2.1 战俘赦免

2.1.1 题目

题目描述:
现有2^n x 2^n名战俘站在一个正方形方阵等待发落,王决定赦免一部分战俘,将矩阵分为4个更小的正方形矩阵,其中左上角矩阵的所有战俘都将被赦免。剩下的3个小矩阵中,每一个矩阵继续分为4个更小的矩阵,同样的方式赦免战俘,直到无法再分下去为止。
给出n,请输出每名战俘的命运,其中0代表被赦免,1代表不被赦免。
输入格式
一个整数n(1≤n≤10)
输出格式
2n x 2n的矩阵,数字之间有一个空格。
输入样例:
3
输出样例:
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1

2.1.2 分析

我们需要两个表示下标的变量,每次确定现在等待发落的是多少行多少列到多少行多少列的战俘,如果是左上角的那个矩阵,就赋值为0,如果不是,就继续分

2.1.3 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int a[10000][10000];
void dfs(int n,int f,int j){
   
	if(n==2){
   
	    a[f][j]=0;
	    return;
	} 
	for(int i=f; i<f+n<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值