2024年3月11日 算法刷题记录

2024年3月11日

习题 2.4 Repeater(北京大学复试上机题)

链接

题目大意

给你一个仅包含一种字符和空格的模板,模板显示如何创建无尽的图片,将字符用作基本元素并将它们放在正确的位置以形成更大的模板,然后不断进行该操作。

样例

输入:
3
# ## 
# #
1
3
# ## 
# #
3
4OO 
O  O
O  OOO 
2
0输出:
# ## 
# #
# #   # #         # #   # ##     #           #     # 
# #   # #         # #   # ## #               # #   #                 #    # #               # #   
# #   # #         # #   # ##     #           #     # 
# #   # #         # #   # ## #   # #         #     #          # #   # #         # #            #             # #            # #   # #         #     #          # #   # #         
# #   # #         # #   # ##     #           #     # 
# #   # #         # #   # ## #               # #   #                 #    # #               # #   
# #   # #         # #   # ##     #           #     # 
# #   # #         # #   # #OO  OO     O  OO  O    O  OO  O    OO  OO     OO          OO 
O  O        O  O
O  O        O  OOO          OO OO          OO 
O  O        O  O
O  O        O  OOO          OO OO  OO     O  OO  O    O  OO  O    OO  OO     

解法

很显然,这里需要用到递归。其次,由于图形复杂,需要一个数字用来缓存图形,我们一点一点填进去。

大的绘图由小的模块组成,每个小的模块都可以再次拆分,直到每个小的模块只剩下单个字符,因此考虑使用递归。递归考虑为给定当前的模块的起始绘图区域,指定符号,交给下一个递归去绘制;空白,则直接绘制。

空白似乎也可以当作一种符号,没有必要分开处理

递归表达式:
d r a w ( d e p t h , x , y ) = { a n s [ x + i ] [ y + j ] = t e p [ i ] [ j ] ( d e p t h = = 1 ) d r a w ( d e p t h − 1 , x + i ∗ s i z e , y + j ∗ s i z e ) ( d e p t h > 1 ) \left. draw(depth,x,y)=\left\{\begin{aligned}&ans[x+i][y+j]=tep[i][j] &&(depth==1)\\&draw(depth-1,x+i*size,y+j*size) &&(depth >1)\end{aligned}\right.\right. draw(depth,x,y)={ans[x+i][y+j]=tep[i][j]draw(depth1,x+isize,y+jsize)(depth==1)(depth>1)
其中, i , j ∈ [ 0 , N ) , s i z e = p o w ( N , d e p t h − 1 ) i,j\in [0,N),size=pow(N,depth-1) i,j[0,N),size=pow(N,depth1) a n s ans ans 是目标图形, t e p tep tep 是模板图形

代码

#include <iostream>
#include <cmath>using namespace std;int N, q;
char tep[3001][3001];
char ans[3001][3001];void blank(int deep, int bx, int by) {for (int i = 0; i < pow(N, deep); i ++ ) {for (int j = 0; j < pow(N, deep); j ++ ) {ans[bx+i][by+j] = ' ';    }}
}void pic(int bx, int by) {for (int i = 0; i < N; i ++ ) {for (int j = 0; j < N; j ++ ) {ans[i+bx][j+by] = tep[i][j];}}
}void help(int deep, int bx, int by) {if (deep == 1) {pic(bx, by);return;}for (int i = 0; i < N; i ++ ) {for (int j = 0; j < N; j ++ ) {int nx = i * pow(N, deep-1);int ny = j * pow(N, deep-1);if (tep[i][j] == ' ') {blank(deep-1, bx+nx, by+ny);    }else {help(deep-1, bx+nx, by+ny);}}}
}int main() {while (cin >> N) { // 注意 while 处理多个 caseif (N == 0) break;getchar();for (int i = 0; i < N; i ++ ){for (int j = 0; j < N; j ++ ) scanf("%c", &tep[i][j]);getchar();}cin >> q;help(q, 0, 0);int size = pow(N, q);for (int i = 0; i < size; i ++ ) {for (int j = 0; j < size; j ++ ) {printf("%c", ans[i][j]);}cout << '\n';}}
}
// 64 位输出请用 printf("%lld")

AcWing 动态规划 第一讲 数字三角形模型

基础

image-20240311212835052

着重学习了 DP 的思考方式——基于集合的思考

image-20240311213057095

计算顺序——拓扑序

方格取数

设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:

2.gif

某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。

在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。

输入格式

第一行为一个整数N,表示 N×N 的方格图。

接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。

行和列编号从 11 开始。

一行“0 0 0”表示结束。

输出格式

输出一个整数,表示两条路径上取得的最大的和。

数据范围

N≤10

输入样例:
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
输出样例:
67
分析:

第一反应是两次 DP,但是经弹幕提醒,这样是不行的。这样属于贪心的思路,但是无法证明这样是对的,没有办法说明最优解是两个最大值的和(就好像一个集合最大值不能分解成两个子集的最大值的和)

正解是一次 DP:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

核心问题:

  1. 走两次?—— 用一个状态统一,变成同时走
  2. 不能重复选?—— 体现在状态转移时,走到同一个点只做一次加法

状态表示:一个人分身,同时从起点出发走k步,分别走到(i1, k-i1), (i2, k-i2)时,路径数字之后的最大值。

状态转移:四种可能

代码
#include<iostream>using namespace std;const int N = 12;int a[N][N], f[2*N][N][N];
int n;int main(){cin >> n;int x, y, z;while (cin >> x >> y >> z, x || y || z){a[x][y] = z;}for (int k = 2; k <= n + n; k ++ )for (int i1 = 1; i1 <= n; i1 ++ ) for (int i2 = 1; i2 <= n; i2 ++ ) {int j1 = k - i1, j2 = k - i2;if (j1 >= 1 && j1 <= n && j2 >= 1 && j2 <= n) {int t = a[i1][j1];if (i1 != i2) t += a[i2][j2];int &x = f[k][i1][i2];x = max(x, f[k-1][i1-1][i2-1] + t);x = max(x, f[k-1][i1-1][i2] + t);x = max(x, f[k-1][i1][i2-1] + t);x = max(x, f[k-1][i1][i2] + t);}}cout << f[n+n][n][n] << endl;return 0;
}

要点

  1. 三维 DP,实质上利用了步数相同进行了降维。
  2. 输入中,while 的用法
  3. 循环从 k 开始,逻辑更加清晰,便于计算j1,j2
  4. 利用 t 表示两种情况
  5. 利用引用 x 简化代码
  6. 利用 4 个 max 函数求 4 种情况的最大值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535085.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIPC的“名利场”,生产力革命还是市值猛药?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 苹果这回终于不“挤牙膏”了&#xff0c;急不可耐地扎入了AIPC的“名利场”。 就在2月28日&#xff0c;苹果CEO库克还在股东大会上宣称&#xff1a;“目前市面上用于人工智能的电脑&#xff0c;没有比Mac更好的”。仅一周过去&am…

百度AI智能审核

一、介绍 百度内容审核平台&#xff08;Baidu Content Audit Platform&#xff09;是百度推出的一款用于进行内容审核的平台。该平台利用人工智能技术&#xff0c;对用户上传的各类内容进行审核和过滤&#xff0c;以实现内容的合规和安全&#xff0c;可以识别和过滤涉黄、涉政…

Matlab R2021a安装教程(附带免费安装包)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 Matlab简介 Matlab是一种高级技术计算语言和交互式环境&#xff0c;用于算法开发、数据可视化和数值计算。它集成了数学、工程和科…

探索ChatGPT的前沿科技:解锁其在地理信息系统、气候预测、农作物生长等关键领域的创新应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

JVM 重要知识梳理

一、java内存区域 程序计数器&#xff1a;线程私有&#xff0c;唯一一个不会出现outOfMemoryError的内存区域虚拟机栈&#xff1a;线程私有&#xff0c;栈由一个个栈帧组成&#xff0c;而每个栈帧中都拥有&#xff1a;局部变量表、操作数栈、动态链接、方法返回地址。本地方法…

最大极小值与最小极大值(省模拟赛-16568)

我的代码&#xff1a; #include <iostream> using namespace std; int a[1002]{};int main() {int n;cin>>n;for(int i1;i<n;i){cin>>a[i]; }int jixiaoa[1],jidaa[1],max_jixiao0,min_jida10000;for (int i1;i<n;i){if(a[i]<a[i-1]&&a[i]…

day 55 动态规划part15● 392.判断子序列 ● 115.不同的子序列

这道题目算是 编辑距离问题 的入门题目&#xff08;毕竟这里只是涉及到减法&#xff09;&#xff0c;慢慢的&#xff0c;后面就要来解决真正的 编辑距离问题了. 这个相当于求两个序列的最大公共子序列长度&#xff0c;如果等于s的长度&#xff0c;就是t包含s。一遍过。 class …

手势学习

1. 点击手势 Composable fun ClickableSample() {val number remember {mutableStateOf(0)}Text(text number.value.toString(),textAlign TextAlign.Center,modifier Modifier.wrapContentSize().clickable {number.value}.background(Color.LightGray).padding(horizonta…

以102flowers数据集为例训练ResNet50模型

以102flowers数据集为例训练ResNet50模型 使用飞桨高阶API&#xff0c;使用最少的代码量&#xff0c;实现在102flowers数据集训练ResNet50模型。同时可以一条命令修改成Mnist、Cifar10、Cifar100等数据集&#xff0c;换成其它模型也是只需要一句话代码。 数据集介绍 102flowe…

深入理解Apache Commons Pool2池化技术

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在现代软件开发中&#xff0c;为了提高性能和资源利用率&#xff0c;开发者们经常使用池化技术来管理那些创建和销毁代价较高的对…

SpringController返回值和异常自动包装

今天遇到一个需求&#xff0c;在不改动原系统代码的情况下。将Controller的返回值和异常包装到一个统一的返回对象中去。 例如原系统的接口 public String myIp(ApiIgnore HttpServletRequest request);返回的只是一个IP字符串"0:0:0:0:0:0:0:1"&#xff0c;目前接口…

t_t 你们到底是从哪儿找的那种拿我当制杖一样教的简单的纯HTML模板的呀?

在这个万物vue的年代&#xff0c;网页设计越来越框架化。 上网搜个资料学习学习吧&#xff0c;咵咵咵&#xff0c;“游泳健身&#xff0c;vue了解一下” 我只是想简单地学个html&#xff0c;js啊&#xff01;怎么就这么复杂&#xff01; 曾几何时&#xff0c;在网上找个网页…