当前位置: 首页 > news >正文

018.递归分治

分而治之

分治是一种思想

将大问题分解成子问题

比较经典的分治:归并排序,二叉树后序位置的一系列操作

归并排序:

const int MAXN=91;
int nums[MAXN],n,temp[MAXN];
void mergesort(int l,int r)
{if(l>=r)return ;int mid=(l+r)>>1;mergesort(l,mid);mergesort(mid+1,r);int i=l,j=mid+1,k=l;while(i<=mid&&j<=r){if(nums[i]>nums[j])temp[k++]=nums[j++];else temp[k++]=nums[i++];}while(i<=mid)temp[k++]=nums[i++];while(j<=r)temp[k++]=nums[j++];for(int i=l;i<=r;i++)nums[i]=temp[i];
}

luogu P1498

第一眼 : 画图,n <= 10 ? 那就打表!

好吧 1024*2048 指数级增长还是算了

正解:递归分治

char m[1025][2050];
void dfs(int x,int y,int n){if(n==1){m[x][y]=m[x+1][y-1]='/';m[x][y+1]=m[x+1][y+2]='\\';m[x+1][y]=m[x+1][y+1]='_';return;}n--;int z=1<<n;dfs(x,y,n);dfs(x+z,y-z,n);dfs(x+z,y+z,n);
}
void solve(){int n;read(n);int d=1<<n,w=d<<1;for(int i=1;i<=d;i++){for(int j=1;j<=w;j++){m[i][j]=' ';}}dfs(1,d,n);for(int i=1;i<=d;i++){for(int j=1;j<=w;j++){wr(m[i][j]);}wr('\n');}
}

luogu P5461

比较简单

bool m[1<<10][1<<10];
void f(int n,int x,int y){if(n==1)return;int h=n>>1;for(int i=x;i<x+h;++i)for(int j=y;j<y+h;++j)m[i][j]=0;f(h,x+h,y);f(h,x,y+h);f(h,x+h,y+h);
}
void solve(){int n;read(n);int N=1<<n;for(int i=0;i<N;++i)for(int j=0;j<N;++j)m[i][j]=1;f(N,0,0);for(int i=0;i<N;++i){for(int j=0;j<N;++j){wr(m[i][j],' ');}wr('\n');    }        
}

luogu P1228

二的次幂,容易想到分治

事实如此,将整张图分成左上,坐下,右上,右下四块

递归处理每1/4块图

直到最小2*2

根据特殊点(x,y)与当前块的左上角的相对位置分块递归

放在整张图就是公主位置(x,y)与左上角(1,1)比较

不要陷入函数细节,否则就是顶级折磨 '-'

void dfs(int x,int y,int xx,int yy,int h){if(h==1)return;h>>=1;if(x-xx<h&&y-yy<h){wr(xx+h,yy+h,"1\n");dfs(x,y,xx,yy,h);dfs(xx+h-1,yy+h,xx,yy+h,h);dfs(xx+h,yy+h-1,xx+h,yy,h);dfs(xx+h,yy+h,xx+h,yy+h,h);}if(x-xx<h&&y-yy>=h){wr(xx+h,yy+h-1,"2\n");dfs(x,y,xx,yy+h,h);dfs(xx+h-1,yy+h-1,xx,yy,h);dfs(xx+h,yy+h-1,xx+h,yy,h);dfs(xx+h,yy+h,xx+h,yy+h,h);}if(x-xx>=h&&y-yy<h){wr(xx+h-1,yy+h,"3\n");dfs(x,y,xx+h,yy,h);dfs(xx+h-1,yy+h-1,xx,yy,h);dfs(xx+h-1,yy+h,xx,yy+h,h);dfs(xx+h,yy+h,xx+h,yy+h,h);}if(x-xx>=h&&y-yy>=h){wr(xx+h-1,yy+h-1,"4\n");dfs(x,y,xx+h,yy+h,h);dfs(xx+h-1,yy+h-1,xx,yy,h);dfs(xx+h-1,yy+h,xx,yy+h,h);dfs(xx+h,yy+h-1,xx+h,yy,h);}   
}
void solve(){int k,x,y;read(k,x,y);dfs(x,y,1,1,1<<k);
}
http://www.rkmt.cn/news/132743.html

相关文章:

  • 【FreeRTOS实战】互斥锁专题
  • Excalidraw文档编写规范:Markdown语法与示例
  • Excalidraw图片懒加载优化:减少初始请求量
  • LangSmith 模型评估 (Evaluation) 完整指南
  • 如何更好地作为数据科学家进行沟通
  • 3.1
  • 数字化项目管理系统分享:7款助力企业实现项目智能化协同的工具精选
  • 142_尚硅谷_数组的使用价值
  • 配置Wireshark抓取https数据包
  • 3.4
  • C#应用程序取得当前目录和退出
  • 基于Spring Boot的美食信息分享平台设计与实现毕设源码
  • 多项目管理系统怎么选:8款支持跨项目资源与进度统筹的解决方案
  • 【文章记录-001】
  • 搜索与过滤功能-Cordova 与 OpenHarmony 混合开发实战
  • 2025年主流项目集管理系统工具推荐:6款助力企业实现战略级项目群管控的系统盘点
  • 财务目标页面 UI 与进度展示 - Cordova与OpenHarmony混合开发实战
  • 主次设备号
  • Cordova与OpenHarmony全文搜索功能
  • FFT:嵌入式开发的“算力引擎”,支持Q15定点和F32浮点两种算法
  • 第七届传智杯 初赛 小红的四子棋 题解 简单bfs遍历
  • 对 Promise.race 的理解
  • 用Kotlin 的图像验证码识别系统设计与实现
  • 调用api练习(1)
  • 【计算机毕业设计案例】基于Spring Boot+Vue人力资源管理系统的设计与实现基于springboot的人力资源管理系统的设计与实现(程序+文档+讲解+定制)
  • 改善深层神经网络 第一周:深度学习的实践(一)偏差与方差
  • Harbor镜像仓库的搭建和迁移
  • 研究生必备7款免费AI论文神器:一键极速生成超长篇幅论文
  • Django 中创建用户与修改密码
  • 【课程设计/毕业设计】基于springboot的人力资源管理系统的设计与实现员工个人信息修改、请假、员工 的薪资管理、考勤管理、社保管理【附源码、数据库、万字文档】