动态规划-数字三角形模型

news2024/11/15 11:32:51

title: 数字三角形模型
date: 2023-05-10 14:26:11
categories:

  • Algorithm
  • 动态规划
    tags:
  • 动态规划
  • 数字三角形

数字三角形 Number Triangles

题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

        7 
      3   8 
    8   1   0 
  2   7   4   4 
4   5   2   6   5 

在上面的样例中,从 7 → 3 → 8 → 7 → 5 7 \to 3 \to 8 \to 7 \to 5 73875 的路径产生了最大

输入格式

第一个行一个正整数 r r r ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

输出格式

单独的一行,包含那个可能得到的最大的和。

样例 #1

样例输入 #1

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出 #1

30

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ r ≤ 1000 1\le r \le 1000 1r1000,所有输入在 [ 0 , 100 ] [0,100] [0,100] 范围内。

思路

状态表示:f[i][j]表示从(1,1)走到(i,j)的最大值

每个位置是由上面两个位置递归过来,因此f[i][j]=max(f[i-1][j-1],f[i-1][j])

代码-递推

#include <bits/stdc++.h>

#define int long long
using namespace std;

const int N = 1010;
int n;
int a[N][N];
int f[N][N];

signed main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            cin >> a[i][j];
            f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + a[i][j];
        }
    }
    int t = -1;
    for (int i = 1; i <= n; i++) {
        t = max(t, f[n][i]);
    }
    cout << t << endl;
    return 0;
}

记忆化搜索-递归

#include <bits/stdc++.h>

#define int long long
using namespace std;

const int N = 1010;
int n;
int a[N][N];
int f[N][N]; //记录从下到上累加和

int dfs(int x, int y) {
    if (f[x][y] != -1) return f[x][y]; //记忆化,避免进一步递归
    if (x == n) f[x][y] = a[x][y];
    else f[x][y] = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + a[x][y];
    return f[x][y];
}

signed main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            cin >> a[i][j];
        }
    }
    memset(f,-1,sizeof f);
    dfs(1, 1);
    cout << f[1][1];
    return 0;
}

[NOIP2000 提高组] 方格取数

题目描述

设有 N × N N \times N N×N 的方格图 ( N ≤ 9 ) (N \le 9) (N9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0 0 0。如下图所示(见样例):

A
 0  0  0  0  0  0  0  0
 0  0 13  0  0  6  0  0
 0  0  0  0  7  0  0  0
 0  0  0 14  0  0  0  0
 0 21  0  0  0  4  0  0
 0  0 15  0  0  0  0  0
 0 14  0  0  0  0  0  0
 0  0  0  0  0  0  0  0
                         B

某人从图的左上角的 A A A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B B B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0 0 0)。
此人从 A A A 点到 B B B 点共走两次,试找出 2 2 2 条这样的路径,使得取得的数之和为最大。

输入格式

输入的第一行为一个整数 N N N(表示 N × N N \times N N×N 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的 0 0 0 表示输入结束。

输出格式

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

样例 #1

样例输入 #1

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

样例输出 #1

67

思路

可以直接定义四维数组:f[N][N][N][N]:

f[x1][y1][x2][y2]表示同时走,走到(x1,y1),(x2,y2)的最大值

满足:x1+y1=x2+y2;

转移:

  • 左,左
  • 左,上
  • 上,左
  • 上,上

三维优化:

我们可以设两个人同时出发,从A点走到B点,此时需要维护当前两条路径的状态,也就是f[x1][y1][x2][y2],但是考虑到,两个人同时走,所有他们走的步数是相同的,也就是可以设k=x1+y1=x2+y2,所以可以优化为三个维度f[k][x1][x2]来维护,此时y1=k-x1,y2=k-x2

两个小朋友同时走, 每个人走的步数和是一样的.

动态规划:

  • 状态表示:f[k][x1][x2]

    • 集合:同时走k步,所有从(1,1),(1,1)走到(x1,y1),(x2,y2)能获得的花生的数目
    • 属性:Max
  • 状态计算:

    • 第一个从左边,第二个从左边:f[k-1][x1-1][x2-1]
    • 第一个从左边,第二个从上边:f[k-1][x1-1][x2]
    • 第一个从上边,第二个从左边:f[k-1][x1][x2-1]
    • 第一个从上边,第二个从上边:f[k-1][x1][x2]

注意:

  • 需要判断两个人是否走到同一个格子上面:x1==x2?

代码

四维:

#include <bits/stdc++.h>

#define int long long
using namespace std;

const int N = 20;
int g[N][N];
int f[N][N][N][N];
int n;

signed main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    cin >> n;
    int a, b;
    while (cin >> a >> b >> g[a][b], a);
    for (int x1 = 1; x1 <= n; x1++) {
        for (int y1 = 1; y1 <= n; y1++) {
            for (int x2 = 1; x2 <= n; x2++) {
                for (int y2 = 1; y2 <= n; y2++) {
                    int &x = f[x1][y1][x2][y2];
                    x = max(x, f[x1 - 1][y1][x2 - 1][y2]);
                    x = max(x, f[x1 - 1][y1][x2][y2 - 1]);
                    x = max(x, f[x1][y1 - 1][x2 - 1][y2]);
                    x = max(x, f[x1][y1 - 1][x2][y2 - 1]);
                    if (x1 == x2 && y1 == y2) x += g[x1][y1];
                    else x += g[x1][y1] + g[x2][y2];
                }
            }
        }
    }
    cout << f[n][n][n][n];

    return 0;
}

三维:

#include <bits/stdc++.h>

#define int long long
using namespace std;

const int N = 20;
int g[N][N];
//f[k][x1][x2] 表示同时走k步,从1,1走到 x1,y1 x2,y2可以得到的花生的最大数量
int f[N][N][N];
int n;

signed main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    cin >> n;
    int a, b, c;
    while (cin >> a >> b >> c, a || b || c)g[a][b] = c;

    for (int k = 2; k <= 2 * n; k++) {
        for (int x1 = 1; x1 <= n; x1++) {
            for (int x2 = 1; x2 <= n; x2++) {
                int y1 = k - x1, y2 = k - x2;
                if (y1 >= 1 && y1 <= n && y2 >= 1 && y2 <= n) {
                    int t = g[x1][y1];
                    if (x1 != x2) t += g[x2][y2];
                    int &x = f[k][x1][x2];
                    x = max(x, f[k - 1][x1 - 1][x2 - 1] + t);
                    x = max(x, f[k - 1][x1 - 1][x2] + t);
                    x = max(x, f[k - 1][x1][x2 - 1] + t);
                    x = max(x, f[k - 1][x1][x2] + t);
                }
            }
        }
    }
    cout << f[n + n][n][n] << endl;

    return 0;
}

AcWing 1015. 摘花生

题目

题目链接:https://www.acwing.com/problem/content/1017/

Hello Kitty想摘点花生送给她喜欢的米老鼠。

她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。

地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。

Hello Kitty只能向东或向南走,不能向西或向北走。

问Hello Kitty最多能够摘到多少颗花生。

img

思路

动态规划:

  • 状态表示:f[i][j]

    • 集合:所有从(1,1)走到(i,j)的路线
    • 属性:Max
  • 状态计算:集合的划分(很重要的依据:“最后”)

    • 最后一步是从上面下来的:f[i-1][j]+w[i][j]
    • 最后一步是从左边过来的:f[i][j-1]+w[i][j]
  • 状态转移方程:f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j]

代码

#include<iostream>
#include<algorithm>
using namespace std;

const int N=110;
int n,m;
int w[N][N];
int f[N][N];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&w[i][j]);
                
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j];
        printf("%d\n",f[n][m]);
    }
    return 0;
}

AcWing 1018. 最低通行费

题目

题目链接:https://www.acwing.com/problem/content/1020/

一个商人穿过一个 N×N 的正方形的网格,去参加一个非常重要的商务活动。

他要从网格的左上角进,右下角出。

每穿越中间 1 个小方格,都要花费 1 个单位时间。

商人必须在 (2N−1) 个单位时间穿越出去。

而在经过中间的每个小方格时,都需要缴纳一定的费用。

这个商人期望在规定时间内用最少费用穿越出去。

请问至少需要多少费用?

注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。

思路

2N-1表示只能向右和向下走,不能回头

动态规划:

  • 状态表示:f[i][j]

    • 集合:从起点出发,走到第ij列的所有方案
    • 属性:方案中经过所有路线的最小值
  • 状态计算:

    • 注意:
      • 只有不在第一行的时候,才可以从上面走下来
      • 只有不在第一列的时候,才可以从左边走过来
    • 最后一步是从上面下来的:f[i-1][j]+w[i][j]
    • 最后一步是从左边过来的:f[i][j-1]+w[i][j]
  • 状态转移方程:f[i][j]=min(f[i-1][j],f[i][j-1])+w[i][j]

代码

#include<iostream>
using namespace std;

const int N=110,INF=1e9;
int w[N][N];
int f[N][N];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&w[i][j]);
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i==1&&j==1) f[i][j]=w[i][j];//特判左上角
            else
            {
                f[i][j]=INF;
                if(i>1) f[i][j]=min(f[i][j],f[i-1][j]+w[i][j]);//只有不在第一行的时候,才可以从上面下来
                if(j>1) f[i][j]=min(f[i][j],f[i][j-1]+w[i][j]);//只有不在第一列的时候,才可以从左边过来
            }
    printf("%d",f[n][n]);
    return 0;
}

NOIP2008 提高组 传纸条

题目描述

小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一个 m m m n n n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标 ( 1 , 1 ) (1,1) (1,1),小轩坐在矩阵的右下角,坐标 ( m , n ) (m,n) (m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。

在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。

还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用 0 0 0 表示),可以用一个 [ 0 , 100 ] [0,100] [0,100] 内的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度之和最大。现在,请你帮助小渊和小轩找到这样的两条路径。

输入格式

第一行有两个用空格隔开的整数 m m m n n n,表示班里有 m m m n n n 列。

接下来的 m m m 行是一个 m × n m \times n m×n 的矩阵,矩阵中第 i i i j j j 列的整数表示坐在第 i i i j j j 列的学生的好心程度。每行的 n n n 个整数之间用空格隔开。

输出格式

输出文件共一行一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。

样例 #1

样例输入 #1

3 3
0 3 9
2 8 5
5 7 0

样例输出 #1

34

提示

【数据范围】

对于 30 % 30\% 30% 的数据,满足 1 ≤ m , n ≤ 10 1 \le m,n \le 10 1m,n10
对于 100 % 100\% 100% 的数据,满足 1 ≤ m , n ≤ 50 1 \le m,n \le 50 1m,n50

【题目来源】

NOIP 2008 提高组第三题。

思路

从右下角回来可以等价于从左上角走下去,题目就转换为从左上角同时走两条不相交的路线到右下角的权值的最大值。

状态表示:f[k][x1][x2]表示同时走k步,所有从(1,1),(1,1)走到(x1,y1),(x2,y2)得到的权值的最大值。

状态计算:

  • 第一个从左边,第二个从左边:f[k-1][x1-1][x2-1]
  • 第一个从左边,第二个从上边:f[k-1][x1-1][x2]
  • 第一个从上边,第二个从左边:f[k-1][x1][x2-1]
  • 第一个从上边,第二个从上边:f[k-1][x1][x2]

注意:不能走到一个格子里,因为最优解一定不会相交,一定可以绕开这个点向其他地方走。

代码

#include <bits/stdc++.h>

#define int long long
using namespace std;

const int N = 100;
int n, m;
int f[N * 2][N][N];
int g[N][N];

signed main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> g[i][j];
        }
    }
    for (int k = 2; k <= n + m; k++) {
        for (int x1 = 1; x1 < k; x1++) {
            for (int x2 = 1; x2 < k; x2++) {
                int y1 = k - x1, y2 = k - x2;
                if (y1 < 1 || y1 > m || y2 < 1 || y2 > m) continue;
                int &x = f[k][x1][x2];
                x = max(x, f[k - 1][x1][x2]);
                x = max(x, f[k - 1][x1][x2 - 1]);
                x = max(x, f[k - 1][x1 - 1][x2]);
                x = max(x, f[k - 1][x1 - 1][x2 - 1]);
                if (x1 == x2 && y1 == y2) x += g[x1][y1];
                else x += g[x1][y1] + g[x2][y2];
            }
        }
    }
    cout << f[n + m][n][n];
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cy5.5-聚乙二醇-羟基;PEG2000;Cy5.5-PEG-OH结构式以及相关信息介绍

中文名称Cy5.5-聚乙二醇-羟基 英文名称Cy5.5-PEG-OH 性状&#xff1a;蓝色或深蓝色固体或粘性液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水、氯仿、DMSO等常规性有机溶剂 激发/发射波长&#xff1a;655nm/678nm 分子量PEG:1k、2k、3.4k、5k其他分子量可以制定 分…

vue3 - 实现文字横向滚动 / 垂直翻滚功能组件,类似喇叭广告、公告、跑马灯的文字滚动效果(详细组件源码与注释,一键复制开箱即用!)

效果图 在 vue3.js 项目中,完成了文字横向 / 纵向自动重复滚动效果组件,支持设置滚动区域宽高、背景色、展示条数、滚动间隔、横向纵向-方向切换等等,丝滑流畅! 无任何第三方插件依赖,详细的示例及注释,轻松一键复制组件源码开箱即用! 第一步 创建文字滚动组件TextSc…

22年山东省B-2网页渗透测试

首先这道题目就是ip/1找flag的题目,所以我们直接来看环境: 这个题目直接使用抓包 修改头部即可拿到flag 我们接着看一道题目: 这道题目

输入url后,到页面展示出来

目录 1、用户在浏览器中输入url地址 2、缓存解析 3、浏览器进行DNS解析域名得到服务器ip地址 4、TCP三次握手建立客户端和服务器的连接 5、客户端发送HTTP请求获取服务器端的静态资源 6、服务器发送HTTP响应报文给客户端&#xff0c;客户端获取到页面静态资源 7、TCP四次…

探索文本生成世界:原理、技术与应用

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

4.进阶篇

目录 一、按照测试对象划分 1.界面测试&#xff08;UI测试&#xff09; 界面测试的常见错误&#xff1a; 2.可靠性测试 3.容错性测试 4.文档测试 5.兼容性测试 6.易用性 7.安装卸载测试 8.安全性测试 9.性能测试 10.内存泄漏 二、按照是否查看代码 1.黑盒测试 2.…

Dubbo源码解析一Dubbo SPI

Dubbo SPI 概述节点角色说明1. JDK SPI1.1 JDK SPI使用1.2 JDK SPI加载过程1.3 JDK SPI优缺点1.3.1 优点1.3.2 缺点 2. Dubbo中的SPI2.1 概述2.2 入门案例2.3 源码分析2.3.1 依赖注入2.3.2 动态增强2.3.2.1 装饰者模式2.3.2.2 Dubbo中的AOP 2.3.3 动态编译2.3.3.1 SPI中的自适应…

【数据结构】- 几个步骤教你认识并实现一个链表之带头(哨兵位)双向循环链表(中)

文章目录 前言&#x1f31f;一、带头双向循环链表&#x1f30f;1.1头删&#xff1a;&#x1f4ab;1.1.1代码&#xff1a;&#x1f4ab;1.1.2流程图&#xff1a; &#x1f30f;1.2尾删&#xff1a;&#x1f4ab;1.2.1代码&#xff1a;&#x1f4ab;1.2.2流程图&#xff1a; &…

5. Mysql索引优化实战二

MySQL性能调优 1. 分页查询优化1.1 根据自增且连续的主键排序的分页查询1.2 根据非主键字段排序的分页查询 2. Join关联查询优化 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 本节课内容&#xff1a; 1…

HTTP第七讲——HTTP报文

报文结构 拿 TCP 报文来举例&#xff0c;它在实际要传输的数据之前附加了一个 20 字节的头部数据&#xff0c;存储 TCP 协议必须的额外信息&#xff0c;例如发送方的端口号、接收方的端口号、包序号、标志位等等。 有了这个附加的 TCP 头&#xff0c;数据包才能够正确传输&…

HTML 基础知识

HTML基础知识 1. VSCode的安装与配置 下载地址 https://code.visualstudio.com/ 安装插件 Live Server Auto Rename Tag 自动格式化 点击 settings&#xff0c;然后输入format&#xff0c;然后勾选上 Format On Save。 2. HTML 基础标签 2.1 文件结构 快捷键&#xff1…

安卓实现左侧列表选择项点击,右侧fragment切换

安卓实现左侧列表选择项点击&#xff0c;右侧fragment切换 问题背景 安卓日常开发中&#xff0c;有时候需要开发页面中&#xff0c;显示左侧会列表选择项&#xff0c;点击不同的选项后右侧切换fragment显示&#xff0c;本文将介绍实现的一个思路。 问题分析 要实现的效果如…

前端三剑客 HTML+CSS+JS

文章目录 一、HTML1.1 基础标签1.2 列表1.3 表格1.4 表单 二、CSS2.1 引入方式2.2 CSS 选择器2.2.1 基本选择器2.2.2 组合选择器 2.3 常用属性2.3.1 背景2.3.2 文本2.3.3 字体2.3.4 display元素类型2.3.5 浮动2.3.6 盒子模型 三、JavaScript3.1 引入方式3.2 数据类型3.2.1 数组…

tomcat集群下的session共享和负载均衡

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jre&#xff1a;1.7.0_80 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; redis…

cmd@快捷键方式@静默执行命令@修复桌面空白快捷方式图标

文章目录 ref前言快捷方式执行命令行或打开文件eg:直接打开某个文件 创建快捷方式eg:快捷方式运行命令 修复快捷方式图标空白问题逐个修复批量修复一次性操作:逐步操作 执行效果第三方工具修复 ref How can I execute a Windows command line in background? - Super Userstb…

2022年5个不寻常的Web3预测

正如埃隆马斯克所说&#xff0c;“最有趣的结果是最有可能的”。所以&#xff0c;这是我对web3的5个不同寻常的预测&#xff0c;下面我将详细介绍我是如何得出这些想法的&#xff1a; 口袋妖怪训练师将是一份全职工作有人会使用JPEG支持的贷款购买房屋(IRL)DAO将收购一家上市公…

并发编程11:Synchronized与锁升级

文章目录 11.1 面试题11.2 Synchronized的性能变化11.3 Synchronized锁种类及升级步骤11.3.1 多线程访问情况11.3.2 升级流程11.3.3 无锁11.3.4 偏锁11.3.5 轻锁11.3.6 重锁11.3.7 小总结 11.4 JIT编译器对锁的优化11.4.1 JIT11.4.2 锁消除11.4.3 锁粗化 11.5 小总结 11.1 面试…

电影《银河护卫队3》观后感

上周看了电影《银河护卫队3》&#xff0c;本部电影&#xff0c;主要是围绕着主角团队中的一个队员展开叙事的&#xff0c;在团队中&#xff0c;这名队员叫“火箭”&#xff0c;是一只经过基因改造过的浣熊。 当初进行改造的团队&#xff0c;是一家拥有基因改造技术的团队&…

基于SpringBoot, Vue实现的校园二手书交易系统

背景 在Internet高速发展的今天&#xff0c;计算机的应用几乎完全覆盖我们生活的各个领域&#xff0c;互联网在经济&#xff0c;生活等方面有着举足轻重的地位&#xff0c;成为人们资源共享&#xff0c;信息快速传递的重要渠道。在中国&#xff0c;网上管理的兴起也同时飞速发…

Solidity中哈希函数的编码与解码

起因 写这篇文章的起因&#xff0c;是我在前端调试合约的时候&#xff0c;发现合约报错了&#xff0c;点开命令行报错&#xff0c;发现返回的是合约的 callData&#xff0c;我直接表演一个眼前一黑&#xff0c;我怎么直接的知道是调用哪个方法的时候报错呢&#xff1f; 于是有…