首页 > 编程语言 >算法学习(算法笔记胡凡)

算法学习(算法笔记胡凡)

时间:2024-07-22 09:11:59浏览次数:13  
标签:胡凡 include int 笔记 算法 sunnywhy https 棋盘 com

目录

考生排序

https://sunnywhy.com/sfbj/4/1/92

结构体的使用,sort函数的使用

递归问题

数塔问题

https://sunnywhy.com/sfbj/4/3/116

动态规划问题dp

例如给定样例

5
5
8 3
12 7 16
4 10 11 6
9 5 3 9 4

image-20240722082354508

方程:

dp[n][j]= s[n][j] 最后一排作为塔顶时,其最大值即为其自身值

dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+s[i][j] 非最后一排,其最大值为其相连左下角和右下角作为塔顶的最大值加上其自身值

参考:

回文字符串

https://sunnywhy.com/sfbj/4/3/117

使用递归求解,考虑如何将其划分为小问题

棋盘覆盖问题

https://sunnywhy.com/sfbj/4/3/120

分治法

使用分治的思想,将大棋盘划分为四个小棋盘,特殊格必位于四个小棋盘中的一个,假设位于左上子棋盘,则将左上子棋盘与其他子棋盘联通处,使用一个L型骨牌将其他三个无特殊格的子棋盘变为有特殊格,此时问题便转化为了四个规模较小的子问题。

即步骤为:

  1. 将大棋盘划分为四个小棋盘,特殊格必位于四个小棋盘中的一个。
  2. 假设特殊格位于左上子棋盘,在左上子棋盘与其他子棋盘联通处,使用一个L型骨牌将其他三个无特殊格的子棋盘变为有特殊格。
  3. 这样,问题便转化为了四个规模较小的子问题,对四个子棋盘重复上述步骤,直到棋盘不能再划分。

具体函数编写:

首先判断是否在左上,若在左上,则在联通处使用L型骨牌,并递归进入左上子棋盘,若不在左上,则将左上子棋盘的右下角设为特殊格并递归进入左上子棋盘。其他子棋盘同理。

image-20240722082726427

代码+注释:

#include<iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAXN (256*256-1)/3

int i=0;//使用的L型骨牌数目

struct Point{
    int x,y;
    Point(){}
    Point(int _x,int _y){
        x=_x;
        y=_y;
    }
}cards[MAXN];

bool cmp(Point a, Point b) {
    if (a.x != b.x) return a.x < b.x;
    else return a.y < b.y;
}

void chessBoard(int x,int y,int cx,int cy,int k);

int main(){
    int k,cx,cy;
    cin>>k>>cx>>cy;
    int h = (int)pow(2.0,1.0*k);
    chessBoard(1,1,cx,cy,h);
   
    sort(cards,cards+i,cmp);
    for (int j= 0; j < i; j++)
    {
     cout<<cards[j].x<<" "<<cards[j].y<<endl;

     
    }

}
void chessBoard(int x,int y,int cx,int cy,int k){ //x,y为当前求解的棋盘的左下角的点
    if (k==1) return;
    int h = k/2; //h代表将棋盘分为四个,一个正方形子棋盘的长与宽
    //首先考虑特殊点在子棋盘的左上角
    if (cx<x+h&&cy>=y+h) {
        cards[i++] =Point(x+h,y+h-1); //cards用来记录使用过的L型骨牌
        chessBoard(x,y+h,cx,cy,h);//递归进入子棋盘
    }else{//若不在左上角
        chessBoard(x,y+h,x+h-1,y+h,h);//若特殊点不在左上棋盘,则填充左上棋盘中的右下角
    }
    //左下
    if (cx<x+h&&cy<y+h){
        cards[i++] = Point(x+h,y+h);
        chessBoard(x,y,cx,cy,h);
    } else{
        chessBoard(x,y,x+h-1,y+h-1,h);
    }
    //右上
     if (cx>=x+h&&cy>=y+h){
        cards[i++] = Point(x+h-1,y+h-1);
        chessBoard(x+h,y+h,cx,cy,h);
    } else{
        chessBoard(x+h,y+h,x+h,y+h,h);
    }
     //右下
    if (cx>=x+h&&cy<y+h)
    {
      cards[i++] = Point(x+h-1,y+h);
      chessBoard(x+h,y,cx,cy,h);
    }else{
      chessBoard(x+h,y,x+h,y+h-1,h);
    }

}

参考:

盒分形

https://sunnywhy.com/sfbj/4/3

首先确定问题规模,n层的盒分形问题规模为 \(3^{n-1}\),即n度的盒分形图为一个长宽为 \(3^{n-1}\)的正方形。

image-20240722083044984

#include<iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int  MAXN =2187;

char point[MAXN][MAXN];

void printBox(int x,int y,int n);

void printBox(int x,int y,int n){
    if (n==1) point[x][y] = 'X';
    else{
      int d = (int)(pow(3.0,n-2));
        printBox(x,y,n-1);
        printBox(x,y+2*d,n-1);
        printBox(x+d,y+d,n-1);
        printBox(x+2*d,y,n-1);
        printBox(x+2*d,y+2*d,n-1);
    }
}

int main(){
  int n;
  cin>>n;
  int unit = (int)pow(3.0,n-1);//矩形的长和宽
  for (int i = 0; i < unit; i++)
  {
    for(int j=0;j<unit;j++){
      point[i][j]=' ';
    }
  }
  printBox(0,0,n);
  for (int i = 0; i < unit; i++)
  {
    for(int j=0;j<unit;j++){
      cout<<point[i][j];
    }
    cout<<endl;
  }
  

}

参考:

自然数分解之最大积

https://sunnywhy.com/sfbj/4/3/124

当n≥4时:

通过观察规律4=2+2,5=2+3,6=3+3,7=3+2+2…

可以发现拆分的自然数不超过3(拆成1对乘积没有贡献,不如加到后面的数中)且2*3>5,则所有的数只能拆成2或者3

用动态规划求解:

分析n≥4的情况,因为当n<4时,最大乘积为其自身。而本题要求至少分为两个正整数的乘积,则n=2,3的情况与后面不同,单独考虑。

#include<iostream>
using namespace std;
int F(int k){
  if (k==1||k==2||k==3)
  {
    return k;
  }

  // int max = k;
  int max = 1*F(k-1);
  for (int i = 2; i < k; i++)
  {
    if((i*F(k-i))>max){
      max=i*F(k-i);
    }
  }
  return max;
}

int main(){
  int n;
  cin>>n;
  if (n==2)
  {
    cout<<1;
  }else if(n==3){cout<<2;}
  else
  cout<<F(n);
}

自然数分解之方案数

https://sunnywhy.com/sfbj/4/3/125

参考:

01串

https://sunnywhy.com/sfbj/4/3/128/solution

STL练习

迭代器的使用

要访问顺序容器或者关联容器,可以使用迭代器iterator,迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

vector<int>::iterator   it;    //定义一个名为it的变量

cout<<*it;      //输出it所指元素
it++;

标签:胡凡,include,int,笔记,算法,sunnywhy,https,棋盘,com
From: https://www.cnblogs.com/cc-coding/p/18315300

相关文章

  • 洛谷算法题
    目录数字反转迪杰斯特拉算法背包问题字符串排序P1192台阶问题P1111修复公路炸铁路问题计数问题......
  • 即使通过了示例测试用例,Dijkstra 算法也不起作用
    所以我遵循了维基百科关于Dijkstra算法和Brilliants的伪代码。https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Pseudocodehttps://brilliant.org/wiki/dijkstras-short-路径查找器/这是我的代码,它不起作用。谁能指出我的代码中的缺陷吗?#Usespyt......
  • 基于GA遗传算法的WSN网络节点覆盖优化matlab仿真
    1.程序功能描述      通过遗传优化算法,优化WSN无线传感器网络中的各个节点的坐标位置以及数量,使得整个网络系统已最少数量的节点达到最大的网络覆盖率。仿真最后输出覆盖率收敛曲线,节点数量收敛曲线,GA优化前后的覆盖率变化情况。 2.测试软件版本以及运行结果展示MATLA......
  • 离散化笔记汇总
    火烧赤壁题目背景曹操平定北方以后,公元208年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了。孙权任命周瑜为都督,拨给他三万水军,叫他同刘备协力抵抗曹操。隆冬的十一月,天气突然回暖,刮起了东南风。没想到东吴......
  • 【普及组】广度优先搜索BFS——到达型搜索问题_C++算法竞赛
    文章目录1.走迷宫例1.洛谷B3625迷宫寻路例2.洛谷P1825[USACO11OPEN]CornMazeS例3.[ABC348D]MedicinesonGrid(AtCoder)2.生活背景下的常见问题例.P3958[NOIP2017提高组]奶酪3.输出路径例.洛谷P6207[USACO06OCT]CowsonSkatesGEnd提示:本文建议有一定......
  • STM32学习笔记
    DAY1一、嵌入式的概述国内定义:嵌入式就是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于对于体积、可靠性、功耗、性能等方面有严格要求的专用计算机系统,要求嵌入式开发人员对嵌入式知识体系有清晰的认知。更简单的说,处理桌面PC和服务器之外,所有的控制类设备都是嵌......
  • 【算法】浅析贪心算法
    贪心算法:高效解决问题的策略1.引言在计算机科学和优化领域,贪心算法是一种常用的解决问题的策略。它以当前情况为基础,做出最优选择,从而希望最终结果也是最优的。本文将带你了解贪心算法的原理、使用方法及其在实际应用中的意义,并通过代码示例和图示帮助大家更好地理解。2......
  • 阅读笔记《CCSP认证官方指南》第2版
    按需自助服务:允许客户自主扩展计算和存储,而不需要或很少需要提供商的介入或提前沟通。这项服务是实时生效的。入侵检测分析人员必须理解组织在做什么、为什么做、如何做以及在哪里做,以便更好地理解外部攻击的性质和强度,并相应地调整安全基线。云计算平台的标志性特性:弹性、简单......
  • 算法 - 求二进制数中1的个数
    转自: https://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html 一些简单的方法就不转了,转最后两个平行算法intBitCount4(unsignedintn){n=(n&0x55555555)+((n>>1)&0x55555555);n=(n&0x33333333)+((n>>2)&0x3333333......
  • 【机器学习】机器学习的基本知识点(包括背景、定义、具体内容、功能、使用场景、操作、
    引言机器学习是一门涉及多个领域的交叉学科,它主要研究如何让计算机模拟或实现人类的学习行为,以获取新的知识或技能,从而改善系统性能。它是人工智能的核心部分,并且与概率论、统计学、逼近论、凸分析、算法复杂度理论等多个学科相关。文章目录引言一、机器学习的背景二......