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

动态规划

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

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

数学归纳法:

  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数组中对应的状态,就像是数列里面的每一项。最后感谢您阅读我的文章,对于动态规划系列,我会一直更新,如果您觉得内容有帮助,可以点赞加关注,以快速阅读最新文章。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么快速采集京东、淘宝天猫、1688、拼多多等百家电商产品图片和视频

作为新时代电商&#xff0c;主图和视频素材尤为关键&#xff0c;有好的主图才能更加的吸引客户点击&#xff0c;促进成交量。但是现在很多商家直接制作的主图都很难有预期效果&#xff0c;自己拍摄的图片暗沉&#xff0c;没有光鲜亮丽的突出性。所以现在很多人都是在采集同类商…

Unity中Shader裁剪空间推导(正交相机到裁剪空间的转化矩阵)

文章目录 前言一、正交相机 转化到 裁剪空间 干了什么1、正交相机裁剪的范围主要是这个方盒子2、裁剪了之后&#xff0c;需要把裁剪范围内的坐标值化到[-1,1]之间&#xff0c;这就是我们的裁剪空间。3、在Unity中&#xff0c;设置相机为正交相机4、在这里设置相机的近裁剪面和远…

Python 雨花 - 前言

众多技术教程的个人网站 https://wukongnotnull.com/ 目录 ⛳️ 教程介绍&#x1f3af; 前置要求⚽️ 学习交流群&#x1f9ed; 教学文档配套视频&#x1f94e; 一对一 VIP答疑辅导&#x1f4a1; 参考文献 ⛳️ 教程介绍 Python 入门教程&#xff0c;通俗易懂&#xff0c;快速…

手滑误删备忘录?这样做手滑误删也能恢复

在这个快节奏的时代&#xff0c;备忘录几乎成了我日常生活的救命稻草。匆忙间&#xff0c;我时常依赖它记录那些一闪而过的灵感或是重要的待办事项。但你有没有过这样的经历&#xff1f;在滑动屏幕的一瞬间&#xff0c;一个不小心&#xff0c;重要的备忘录就这么消失了&#xf…

springboot+vue项目如何在linux上部署

在linux上部署项目&#xff0c;是我们实训项目作业的最后一步&#xff0c;此时我们的项目编码测试已经完成&#xff0c;接下来就需要在服务器上部署上线&#xff0c;那么如何部署上线&#xff0c;接下来我会在虚拟机上的CentOS7系统上实现部署&#xff0c; 一.下载JDK 因为我…

如何搭建一个高效的Python开发环境

“工欲善其事&#xff0c;必先利其器”&#xff0c;这里我们来搭建一套高效的 Python 开发环境&#xff0c;为后续的数据分析做准备。 关于高效作业&#xff0c;对于需要编写 Python 代码进行数据分析的工作而言&#xff0c;主要涉及两个方面。 1. 一款具备强大的自动完成和错…

c语言:计算阶乘的和|练习题

一、题目 输入一个数n&#xff0c;计算1&#xff01;2&#xff01;……n&#xff01;的和 如图&#xff1a; 二、思路分析 设置两个函数 1、一个函数求阶乘 2、一个函数求多个数相加的总和 3、把求阶乘的函数&#xff0c;嵌套在求相加总和的函数里面 三、代码截图【带注释】 四…

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图&#xff1a;最左侧的分类列是跟随甘特图滚动的&#xff0c;因为这一列如果需要自定义&#xff0c;比如表格的话可能会存在行合并的情况&#xff0c;这个时候甘特图是没有办法做的&#xff0c;然后甘特图的表头又需要做滚动时固定&#xff0c;所以设置了甘特图滚动时&…

【代码混淆】react-native 代码混淆

​ 使用react native开发app&#xff0c;实现代码混淆的操作。 无论是加密还是运行时虚拟机&#xff0c;最后都可以通过执行时调试把代码反向生成出来原来的代码&#xff0c;虽然能抵御低端的黑客攻击&#xff0c;但是对高端黑客却形同虚设。 代码混淆是通过修改源代码结构和变…

【习题】运行Hello World工程

判断题 1. DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。 正确(True)错误(False) 正确(True) 2. main_pages.json存放页面page路径配置信息。 正确(True)错误(False) 正确(True) 单选题 1. 在stage模型中&#xff0c;下列配置文件属于AppScope文件夹的是&am…

视频专访 | 每日互动刘宇:AI不止GC,更有TA

当前&#xff0c;“百模大战”已进入拼落地、拼应用的下半场&#xff0c;给千行百业带来了降本增效的巨大机遇。聚焦到品牌营销领域&#xff0c;大模型给行业带来了哪些改变&#xff1f;企业如何利用大模型优化数字化营销手段、提升数字化营销效果&#xff0c;最终驱动品牌实现…

嵌入式——I2C原理代码结合(干货)看图易懂

学习目标 理解I2C通讯原理理解I2C通讯过程中的信号理解软件I2C实现过程理解硬件I2C的工作内容学习内容 I2C通讯规则 I2C总线包括两根信号线:SDA(串行数据线)和SCL(串行时钟线)。这两根信号线共用一个总线,因此在总线上可以连接多个设备。在I2C总线上,每个设备都有一个唯…

微服务注册与发现——Eureka

文章目录 Eureka使用引用配置启动类标记访问微服务注册微服务工程添加引用增加配置启动类增加注解启动服务注册 Eureka Server集群部署修改配置文件启动多个eureka实例微服务注册到多个eureka实例 为Eureka Server添加用户认证引入spring-security配置关闭security的csrf&#…

C练习——水仙花数

“水仙花数”是指一个三位数&#xff0c;其每位数字的立方和等于该数本身。 例如&#xff1a;153是一个“水仙花数”&#xff0c;因为1531的三次方&#xff0b;5的三次方&#xff0b;3的三次方。 // 打印 100 - 999 的所有水仙花数 // 利用for循环控制100 - 999个数&#xff…

Exploring the Limits of Masked Visual Representation Learning at Scale论文笔记

论文名称&#xff1a;EVA: Exploring the Limits of Masked Visual Representation Learning at Scale 发表时间&#xff1a;CVPR2023 作者及组织&#xff1a;北京人工智能研究院&#xff1b;华中科技大学&#xff1b;浙江大学&#xff1b;北京理工大学 GitHub&#xff1a;http…

从公务员转行网络安全工程师,铁饭碗也比不过“金饽饽”。

前言 随着疫情的不断变化&#xff0c;影响力席卷大多数的行业&#xff0c;许多人也在这次疫情中失去了工作&#xff0c;或是收入与之前相比大打折扣&#xff0c;因此越来越多的人涌入到了考公或考事业单位的大潮之中。 考公是一场与实力与运气的battle&#xff0c;不到上岸的…

MS2244模拟开关可Pin to Pin兼容NJM2244

MS2244 是一款集成的视频开关&#xff0c;实现三输入视频或音频信号的三选一。可Pin to Pin兼容NJM2244。 芯片集成了 75Ω驱动电路&#xff0c;可以直接驱动电视监控器。芯片工作电压 5V&#xff5e;12V&#xff0c;带宽 10MHz&#xff0c;抗串扰 70dB (4.43MHz)。另外芯片还集…

NC(65)元数据增加字段

以报销单主表er_bxzb表为例&#xff0c;增加15个字段字段以及两个其他业务所需字段 1、先在er_bxzb增加字段 增加字段 alter table er_bxzb add no_invoice char(1) default(N);alter table er_bxzb add is_enabled_taxation_cloud char(1) default(N);alter table er_bxzb a…

SANSAN新鲜事|场站数字化避“坑”指南

场站如何定义 场站是指在某个特定的区域内&#xff0c;为了完成某个特定的任务而建立的一个或多个设施的集合。常见的场站涉及各行各业&#xff0c;比如电力行业的变电站、开闭所、配电房等&#xff1b;再比如燃气行业的门站、调压站、加气站等&#xff1b; 另外&#xff0c;还…

Ansys Speos | 3D Texture 车灯案例应用

Speos 3D Texture功能提供了一种解决方案&#xff0c;可以绕过 CAD 系统限制来设计和模拟数百万个小图案&#xff1a;pattern图案的分布类型和重复次数。3D Texture可用于设计照明系统&#xff0c;例如光导、车灯、亮度增强膜 &#xff08;BEF&#xff09; 和由数百万个几何元素…