【六】【C语言\动态规划】买卖股票的最佳时机含手续费、买卖股票的最佳时机 III、买卖股票的最佳时机 IV,三道题目深度解析

news2025/2/5 12:06:37

动态规划

动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重复计算。

动态规划与数学归纳法思想上十分相似。

数学归纳法:

  1. 基础步骤(base case):首先证明命题在最小的基础情况下成立。通常这是一个较简单的情况,可以直接验证命题是否成立。

  2. 归纳步骤(inductive step):假设命题在某个情况下成立,然后证明在下一个情况下也成立。这个证明可以通过推理推断出结论或使用一些已知的规律来得到。

通过反复迭代归纳步骤,我们可以推导出命题在所有情况下成立的结论。

动态规划:

  1. 状态表示:

  2. 状态转移方程:

  3. 初始化:

  4. 填表顺序:

  5. 返回值:

数学归纳法的基础步骤相当于动态规划中初始化步骤。

数学归纳法的归纳步骤相当于动态规划中推导状态转移方程。

动态规划的思想和数学归纳法思想类似。

在动态规划中,首先得到状态在最小的基础情况下的值,然后通过状态转移方程,得到下一个状态的值,反复迭代,最终得到我们期望的状态下的值。

接下来我们通过三道例题,深入理解动态规划思想,以及实现动态规划的具体步骤。

714. 买卖股票的最佳时机含手续费

题目解析

状态表示

题目要求我们求利润的最大值,如果我们定义dp[i]表示,从第0天到第i天所能获得的最大利润,我们想一想能不能推导出状态转移方程?如果我们要推导出第i天的状态,仅依靠第i-1的状态是得不出来的,因为我们考虑第i天的最大利润时,需要考虑两种情况,要么第i天结束的时候,我们手上有股票,要么第i天结束的时候我们手上没有股票,这两种情况分别推导,又需要用到第i-1天的这两种情况的最大利润值。

所有我们继续将状态细分。

定义dp[i][j](j=0或1,0表示手上有股票,1表示手上没股票)

dp[i][j]表示第i天结束的时候拥有j状态时所能获得的最大利润。

状态转移方程

我们想一想能不能由其他的状态推导出第i天的两个状态?

dp[i][0]表示第i天结束的时候手上有股票时所能获得的最大利润。

dp[i][1]表示第i天结束的时候手上没有股票时所能获得的最大利润。

dp[i-1][0]表示第i-1天结束的时候手上有股票时所能获得的最大利润。

dp[i-1][1]表示第i-1天结束的时候手上没有股票时所能获得的最大利润。

当第i天结束的时候手上有股票时,对应dp[i][0],第i-1天结束时手上要么有股票,然后第i天白天没有把他卖掉,要么第i-1天结束时手上没有股票,然后第i天白天我们买了股票。

所以第i天结束时手上有股票时所能获得的最大利润是这两种情况下所能获得的最大利润。

很容易得到dp[i][0]=fmax(dp[i-1][0],dp[i-1][1]-prices[i]);

因为我们一笔交易只需要花费一次手续费,所以我们只要选择在买入股票的时候或者卖出股票的时候减去手续费就行,这里我们选择在卖出股票的时候减去手续费,所以买入的时候没有影响。

当第i天结束的时候手上没有股票时,对应dp[i][1],第i-1天结束时手上要么有股票,然后第i天白天卖出股票,要么第i-1天结束时手上没股票,然后第i天什么也不做。

所以第i天结束时手上有股票时所能获得的最大利润是这两种情况下所能获得的最大利润。

很容易得,dp[i][1]=fmax(dp[i-1][0]+prices[i]-fee,dp[i-1][1]);

故状态转移方程为,

dp[i][0]=fmax(dp[i-1][0],dp[i-1][1]-prices[i]); dp[i][1]=fmax(dp[i-1][0]+prices[i]-fee,dp[i-1][1]);

初始化

根据状态转移方程我们知道,想要推导出第i天的状态,我们需要利用第i-1天的状态。

所以我们需要初始化第0天的状态值。

由状态表示,dp[i][j](j=0或1,0表示手上有股票,1表示手上没股票)

dp[i][j]表示第i天结束的时候拥有j状态时所能获得的最大利润。

dp[0][0]表示第0天结束时,手上有股票,说明第0天白天买了股票,利润为-prices[0]

dp[0][1]表示第0天结束时,手上没股票,说明第0天白天没有买股票,利润为0

故初始化为,

dp[0][0]=-prices[0]; dp[0][1]=0;

填表顺序

根据状态转移方程我们知道,想要推导出第i天的状态,我们需要利用第i-1天的状态。

所以填表顺序为,从左往右

返回值

根据状态表示,

dp[i][j](j=0或1,0表示手上有股票,1表示手上没股票)

dp[i][j]表示第i天结束的时候拥有j状态时所能获得的最大利润。

我们需要返回最后一天的利润最大值。

故返回值为,

return fmax(dp[n-1][0],dp[n-1][1]);

代码实现

 
int maxProfit(int* prices, int pricesSize, int fee) {

    //0:手上有股票  1:手上没股票
    int n=pricesSize;
    int dp[n][2];

    dp[0][0]=-prices[0];
    dp[0][1]=0;
    for(int i=1;i<n;i++){
        dp[i][0]=fmax(dp[i-1][0],dp[i-1][1]-prices[i]);
        dp[i][1]=fmax(dp[i-1][0]+prices[i]-fee,dp[i-1][1]);

    }

    return fmax(dp[n-1][0],dp[n-1][1]);
}

123. 买卖股票的最佳时机 III

题目解析

状态表示

状态表示是根据经验+题意得到的。

经验一般是以某个位置为结尾或者以某个位置为开始。

我们最开始可以想到的定义是,定义dp[i]表示从第0天开始到第i天所能获得的最大利润,但我们分析可以知道,该状态还可以继续细分,而且如果仅依靠这个状态没办法推导出状态转移方程,所以我们继续将状态进行细分。

根据手上有没有股票我们可以分为,第i天结束的时候,手上有股票,或者手上没有股票。

根据完成交易的次数我们可以分为,第i天结束的时候,完成交易次数是...。

如果将这些情况都考虑到,我们可以定义两个数组。

f[i][j]、g[i][j] (j=0或者1)

f[i][j]表示第i天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i][j]表示第i天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

状态转移方程

我们想一想第i天的状态能不能由其他天的状态推导得到?

f[i][j]表示第i天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i][j]表示第i天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

f[i-1][j]表示第i-1天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i-1][j]表示第i-1天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

针对f[i][j],第i天结束时手上有股票,那么第i-1天结束时,要么手上有股票,然后第i天白天没有卖出股票,什么也没做,要么第i-1天结束时,手上没有股票,然后第i天白天买了股票。

如果第i-1天结束时,手上有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上有股票时的最大利润。如果i-1天结束时,手上没有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上没有股票时的最大利润减去第i天的股票价格,因为第i天白天我们买了股票。

针对g[i][j],第i天结束时手上没有股票,那么第i-1天结束时,要么手上有股票,然后第i天白天卖出股票,要么第i-1天结束时,手上没有股票,然后第i天什么也没做。

如果第i-1天结束时,手上有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上没有股票时的最大利润加上第i天的股票价格。如果i-1天结束时,手上没有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上没有股票时的最大利润。

我们的交易次数的变化可以安排在卖出股票时,也就是当我们卖出股票,交易次数就增加一次。

所以我们的状态转移方程为,

f[i][j]=fmax(f[i-1][j],g[i-1][j]-prices[i]);

g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);

初始化

根据状态转移方程,我们推导出第i天的状态,需要用到i-1天的状态值,所以我们需要初始化第零天的状态。注意, g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);中还需要访问前一天交易次数少一次的状态,这里也不能越界了。

我们先初始化第零天的状态。

f[0][0] f[0][1] f[0][2] g[0][0] g[0][1] g[0][2]

f[i][j]表示第i天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i][j]表示第i天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

第零天不可能出现交易次数大于零的情况,所以对这些情况的初始化不能影响对后续状态的推导。

状态转移方程为,

f[i][j]=fmax(f[i-1][j],g[i-1][j]-prices[i]);

g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);

为了不影响推导,这些值一定不能取到,所以我们初始化无穷小即可。

即,

f[0][1]=-INF; f[0][2]=-INF;

g[0][1]=-INF; g[0][2]=-INF;

f[0][0]表示第零天手上有股票,交易次数为零时所能获得的最大利润,也就是白天买了股票,所以f[0][0]=-prices[0]

g[0][0]表示第零天手上没有股票,交易次数为零时所能获得的最大利润,也就是白天什么都没有做,所以g[0][0]=0;

故状态转移方程为,

f[0][0]=-prices[0];

f[0][1]=-INF;

f[0][2]=-INF;

g[0][0]=0;

g[0][1]=-INF;

g[0][2]=-INF;

填表顺序

状态转移方程为,

f[i][j]=fmax(f[i-1][j],g[i-1][j]-prices[i]);

g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);

由状态转移方程我们知道,需要推导出第i天的状态需要用到第i-1天的状态

所以填表顺序为从左往右

返回值

f[i][j]表示第i天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i][j]表示第i天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

我们需要返回最后一天的最大利润,如果最后一天手上有股票,是不可能获得最大利润,因为必定有一个序列和前面的交易安排全部一样,唯一不一样的是最后一天没有买股票,那么它的最大利润一定比手上有股票时的最大利润大。所以我们只需要考虑手上没有股票时的最大利润即可。

所以返回值为

return fmax(g[n-1][0],fmax(g[n-1][1],g[n-1][2]));

代码实现

 
int maxProfit(int* prices, int pricesSize) {
    int n=pricesSize;
    int f[n][3];
    int g[n][3];
    //f:手上有股票
    //g:手上没有股票
    int INF=0x3f3f3f3f;
    f[0][0]=-prices[0];
    f[0][1]=-INF;
    f[0][2]=-INF;

    g[0][0]=0;
    g[0][1]=-INF;
    g[0][2]=-INF;
    for(int i=1;i<n;i++){
        f[i][0]=fmax(f[i-1][0],g[i-1][0]-prices[i]);
        f[i][1]=fmax(f[i-1][1],g[i-1][1]-prices[i]);
        f[i][2]=fmax(f[i-1][2],g[i-1][2]-prices[i]);

        g[i][0]=g[i-1][0];//为了防止j越界
        g[i][1]=fmax(f[i-1][0]+prices[i],g[i-1][1]);
        g[i][2]=fmax(f[i-1][1]+prices[i],g[i-1][2]);
    }

    return fmax(g[n-1][0],fmax(g[n-1][1],g[n-1][2]));
}

188. 买卖股票的最佳时机 IV

题目解析

状态表示

状态表示是根据经验+题意得到的。

经验一般是以某个位置为结尾或者以某个位置为开始。

我们最开始可以想到的定义是,定义dp[i]表示从第0天开始到第i天所能获得的最大利润,但我们分析可以知道,该状态还可以继续细分,而且如果仅依靠这个状态没办法推导出状态转移方程,所以我们继续将状态进行细分。

根据手上有没有股票我们可以分为,第i天结束的时候,手上有股票,或者手上没有股票。

根据完成交易的次数我们可以分为,第i天结束的时候,完成交易次数是...。

如果将这些情况都考虑到,我们可以定义两个数组。

f[i][j]、g[i][j] (j=0、1、2...或者k)

f[i][j]表示第i天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i][j]表示第i天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

状态转移方程

我们想一想第i天的状态能不能由其他天的状态推导得到?

f[i][j]表示第i天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i][j]表示第i天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

f[i-1][j]表示第i-1天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i-1][j]表示第i-1天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

针对f[i][j],第i天结束时手上有股票,那么第i-1天结束时,要么手上有股票,然后第i天白天没有卖出股票,什么也没做,要么第i-1天结束时,手上没有股票,然后第i天白天买了股票。

如果第i-1天结束时,手上有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上有股票时的最大利润。如果i-1天结束时,手上没有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上没有股票时的最大利润减去第i天的股票价格,因为第i天白天我们买了股票。

针对g[i][j],第i天结束时手上没有股票,那么第i-1天结束时,要么手上有股票,然后第i天白天卖出股票,要么第i-1天结束时,手上没有股票,然后第i天什么也没做。

如果第i-1天结束时,手上有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上没有股票时的最大利润加上第i天的股票价格。如果i-1天结束时,手上没有股票,第i天结束时手上有股票的最大利润就等于i-1天结束时,手上没有股票时的最大利润。

我们的交易次数的变化可以安排在卖出股票时,也就是当我们卖出股票,交易次数就增加一次。

所以我们的状态转移方程为,

f[i][j]=fmax(f[i-1][j],g[i-1][j]-prices[i]);

g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);

初始化

根据状态转移方程,我们推导出第i天的状态,需要用到i-1天的状态值,所以我们需要初始化第零天的状态。注意, g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);中还需要访问前一天交易次数少一次的状态,这里也不能越界了。

我们先初始化第零天的状态。

第零天不可能出现交易次数大于零的情况,所以对这些情况的初始化不能影响对后续状态的推导。

状态转移方程为,

f[i][j]=fmax(f[i-1][j],g[i-1][j]-prices[i]);

g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);

为了不影响推导,这些值一定不能取到,所以我们初始化无穷小即可。

对于第零天交易次数为零的状态,有f[0][0]和g[0][0]

分别表示第零天结束时手上有股票,和手上没有股票的两种情况。

很容易得到,

f[0][0]=-prices[0]; g[0][0]=0;

故,我们可以先把所有状态初始化无穷小,然后把第零天交易次数为零的状态再初始化,即:

    for(int i=0;i<n;i++){
        memset(f[i],-0x3f,sizeof(f[i]));
        memset(g[i],-0x3f,sizeof(g[i]));
    }
    f[0][0]=-prices[0];
    g[0][0]=0;

填表顺序

状态转移方程为,

f[i][j]=fmax(f[i-1][j],g[i-1][j]-prices[i]);

g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);

由状态转移方程我们知道,需要推导出第i天的状态需要用到第i-1天的状态

所以填表顺序为从左往右

返回值

f[i][j]表示第i天结束的时候,手上有股票,完成交易次数为j次,所能获得的最大利润。

g[i][j]表示第i天结束的时候,手上没有股票,完成交易次数为j次,所能获得的最大利润。

我们需要返回最后一天的最大利润,如果最后一天手上有股票,是不可能获得最大利润,因为必定有一个序列和前面的交易安排全部一样,唯一不一样的是最后一天没有买股票,那么它的最大利润一定比手上有股票时的最大利润大。所以我们只需要考虑手上没有股票时的最大利润即可。

即:

int ret=0;
    for(int i=0;i<=k;i++){
        ret=fmax(ret,g[n-1][i]);
    }
    return ret;

代码实现

 
int maxProfit(int k, int* prices, int pricesSize) {
    int n=pricesSize;
    int f[n][k+1];
    int g[n][k+1];
    //f表示手上有股票
    //g表示手上没有股票
    for(int i=0;i<n;i++){
        memset(f[i],-0x3f,sizeof(f[i]));
        memset(g[i],-0x3f,sizeof(g[i]));
    }
    f[0][0]=-prices[0];
    g[0][0]=0;

    for(int i=1;i<n;i++){
        for(int j=0;j<=k;j++){
            f[i][j]=fmax(f[i-1][j],g[i-1][j]-prices[i]);
            if(j==0) g[i][j]=g[i-1][j];//防止j越界
            else g[i][j]=fmax(f[i-1][j-1]+prices[i],g[i-1][j]);
        }
    }

    int ret=0;
    for(int i=0;i<=k;i++){
        ret=fmax(ret,g[n-1][i]);
    }
    return ret;
}

结尾

今天我们学习了动态规划的思想,动态规划思想和数学归纳法思想有一些类似,动态规划在模拟数学归纳法的过程,已知一个最简单的基础解,通过得到前项与后项的推导关系,由这个最简单的基础解,我们可以一步一步推导出我们希望得到的那个解,把我们得到的解依次存放在dp数组中,dp数组中对应的状态,就像是数列里面的每一项。最后感谢您阅读我的文章,对于动态规划系列,我会一直更新,如果您觉得内容有帮助,可以点赞加关注,以快速阅读最新文章。

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

毕设之-消息系统设计(websocket+netty)

文章目录 前言技术选型基本架构 前言 long time no see。 前几天去一家小公司待了待&#xff0c;果断还是选择跑路&#xff0c;第三天就去另一家公司考察环境&#xff0c;和主管聊了两个多小时&#xff0c;非常愉快&#xff0c;就是单位薪资砍了一半。哎&#xff0c;旧事莫提了…

正定矩阵与半正定矩阵 、奇异矩阵

一、正定矩阵与半正定矩阵 请问谁能用易于理解的语言解释下矩阵的正定及半正定&#xff1f; - 知乎 M为一个方阵 定义&#xff1a; 一个非零向量X&#xff0c;如果,那么我们就规定这个M方阵为正定矩阵 单位矩阵是正定矩阵 (positive definite) 同理&#xff1a; 那么这个M…

【Java进阶篇】Java中的枚举的概念、有什么特点和好处

✔️Java枚举的概念、特点和好处 ✔️枚举的概念✔️枚举的特点✔️枚举的好处✔️拓展知识仓✔️枚举如何实现的&#xff1f; ✔️枚举的概念 Java枚举是一种特殊的数据类型&#xff0c;它的每一个值都映射到Enum类的构造函数中&#xff0c;具有固定数量的常量值。枚举类型具有…

台球杆,预计到2026年将达到 6.234 亿美元

台球杆市场多年来一直在稳步增长&#xff0c;这得益于台球作为一种全球娱乐活动的日益普及。2021 年全球台球杆市场价值 5.477 亿美元&#xff0c;预计到 2026 年将达到 6.234 亿美元&#xff0c;预测期内复合年增长率为 2.6%。 就中国市场而言&#xff0c;中国是全球最大的台球…

鹅目标检测数据集VOC格式350张

鹅是一种大型的水禽&#xff0c;常见于湖泊、河流和农田周围。它们的体形庞大&#xff0c;长有长颈和宽阔的翅膀&#xff0c;通常呈灰白色或棕褐色。鹅的头部呈黑色&#xff0c;嘴呈橙色&#xff0c;眼睛则是明亮的蓝色。 鹅是非常社交的动物&#xff0c;常以大群的形式生活在…

YOLOv5改进 | 主干篇 | ShuffleNetV1轻量化网络助力FPS提高(附代码+修改教程)

一、本文内容 本文给大家带来的改进内容是ShuffleNetV1&#xff0c;这是一种为移动设备设计的高效CNN架构。它通过使用点群卷积和通道混洗等操作&#xff0c;减少了计算成本&#xff0c;同时保持了准确性&#xff0c;通过这些技术&#xff0c;ShuffleNet在降低计算复杂度的同时…

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…

Modbus TCP转Profinet协议网关应用

YC-TCP-PN通讯网关&#xff1a;引领工业通讯新篇章 在工业4.0的浪潮下&#xff0c;高效、稳定的通讯技术成为各行业的核心竞争力。作为行业领军者&#xff0c;我们自豪地推出YC-TCP-PN通讯网关&#xff0c;以其卓越性能打破行业技术壁垒&#xff0c;引领工业通讯进入新篇章。 …

使用 Python 和 PyQt 实现路由算法模拟器

项目地址 GitHub - 944613709/Shortest-Path-Simulation: 网络拓扑图最短路径模拟 引言 在现代网络技术中&#xff0c;路由算法扮演着至关重要的角色。它们决定了数据包在网络中的传输路径&#xff0c;从而影响整个网络的效率和性能。为了更好地理解这些算法的工作原理&…

UG模型的显示与隐藏

在UG中&#xff0c;除了通过图层的方式控制模型的显示与隐藏外&#xff0c;还可以直接通过显示与隐藏命令&#xff0c;位置在菜单-编辑-显示与隐藏&#xff0c;需要注意的是这些命令只能对可视图层中的模型进行控制 显示与隐藏&#xff1a;ctrl w 可以通过模型的类别&#xf…

2014年第三届数学建模国际赛小美赛B题全地形伪装解题全过程文档及程序

2014年第三届数学建模国际赛小美赛 B题 全地形伪装 原题再现&#xff1a; 破坏性着色在军事用途中很常见&#xff0c;用于军用车辆、士兵制服和装备。视觉是人类的主要方向感&#xff0c;伪装的主要功能是欺骗人眼。军事服装中存在大量的伪装图案&#xff0c;以适应作战服装与…

概率论中的 50 个具有挑战性的问题 [第 6 部分]:Chuck-a-Luck

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff09;一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…

审视AI Agent:追捧、落地,和2024年的To B破局点

“十个AI应用里面&#xff0c;五个办公Agent&#xff0c;三个AIGC&#xff0c;还有两成是回春的数字人。”那么&#xff0c;Agent到底是不是大模型的AGI终局产品&#xff1f; 作者|斗斗 编辑|皮爷 出品|产业家 今年4月份&#xff0c;斯坦福和谷歌的研究者共同创建了一个…

账号和权限管理

大家无论安装完linux系统和windows系统后&#xff0c;都会要求你去新建一个用户去登录&#xff0c;不会让你们直接使用超级管理员身份去登录自己的系统&#xff0c;这样是为了安全性的考虑。 一、用户账号和组账号概述 1、用户账号类型&#xff1a; linux用户账号类型&#x…

基于openGauss5.0.0全密态数据库等值查询小案例

基于openGauss5.0.0全密态数据库等值查询小案例 一、全密态数据库简介二、环境说明三、测试步骤四、使用约束 一、全密态数据库简介 价值体现&#xff1a; 密态数据库意在解决数据全生命周期的隐私保护问题&#xff0c;使得系统无论在何种业务场景和环境下&#xff0c;数据在传…

跟着LearnOpenGL学习10--基础光照

文章目录 一、前言二、环境光照三、漫反射光照3.1、法向量3.2、计算漫反射光照3.3、全部代码3.4、法线矩阵 四、镜面光照4.1、全部代码 一、前言 现实世界的光照是极其复杂的&#xff0c;而且会受到诸多因素的影响&#xff0c;这是我们有限的计算能力所无法模拟的。 因此Open…

企业微信自建应用获取用户信息

一.前言 开发企业微信自建应用的时候难免会有获取企微个人信息的业务需求,这篇博客将详细说明企微自建应用获取userId的具体流程. 二.基本概念介绍 2.1 corpid 每个企业都拥有唯一的corpid&#xff0c;获取此信息可在管理后台“我的企业”&#xff0d;“企业信息”下查看“企业…

leetcode 1419. 数青蛙(medium)(优质解法)

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚的技术成长平台 代码&#xff1a; class Solution {public int minNumberOfFrogs(String croakOfFrogs) {String t"croak";int tLengtht.length();// hash 数组用来存放青蛙喊的过程&#xf…

企业网银 相关注意事项合辑 不断更新中...

山西省农村信用社 (shanxinj.com) 企业网上银行 山西省农村信用社 企业网上银行&#xff0c;注意事项&#xff1a; 1、通过安装【网银向导】修复网银安全控件、密码控件等&#xff1b; 2、登录界面无Ukey验证&#xff0c;也就是输入企业号、用户编号、登录密码及验证码即可进…