最大收益问题(框数字求最大和)

欢迎访问https://blog.csdn.net/lxt_Lucia~~

宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~dalao们点个关注呗~~


Problem is coming~~~~

Description

铁牌狗最近迷上了一款游戏,但铁牌狗实在是太笨了,他还是要请求你的帮助。

有一个n行m列的矩阵A,矩阵A中每个数字均为正整数,现在铁牌狗要在其中选出一个r行c列的子矩阵B,这个子矩阵B中各个数字之和即为铁牌狗的得分,请你帮铁牌狗计算出他的最高得分是多少。

Input

 

首先输入一个组数T(1 <= T <= 10),表示接下来要输入T组数据。

首先输入四个整数n,m,r,c(1 <= n,m <= 1000,1 <=r <= n ,1 <= c <= m)。

接下来的n行,每行m个数,代表A中的各个数字。

 

矩阵A中的各个数字X均满足 1<=X <=1000。

Output

  对于每组数据,输出一个整数代表答案。

Sample Input

2
4 4 4 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
4 4 2 2
1 2 3 3
1 2 3 4
3 3 3 4
1 1 5 5

Sample Output

40
17


这题其实不难,但是容易是超限,四重循环也是吓死宝宝了....


思路:

1.To begin with,先考虑框的大小正好是整个矩阵的时候,那就没有最大最小了,直接输出矩阵的和就KO咯~

2.In addition,再考虑框的长宽都是1的时候,那就是找这个矩阵里的最大值咯~

3.What's more,除了上边两种情况,就是这种情况咯,也是本题关键,四重循环吓死你们哈哈哈~

4.Last but not the least,得到的结果都存到另外一个数组里,直接快排找最大printf就好啦~


依旧hint一下...数组下标太大可以改全局,而且是多组输入单组就不对了哦...顺便emmm...思路里的每条的开头是英语作文里最常用的连接词,顺便背一下咯~


--------------------------------------------------------------------我只是一条可爱的分界线----------------------------------------------------------------------------


#include<bits/stdc++.h>
using namespace std;
long long int p[1001][1001],q[1001010];
int main()
{
     long long int i,j,k,T,m,n,a,b,c,r,s,z;
     while(scanf("%lld",&T)!=EOF){
            for(z=1;z<=T;z++){
                m=0;n=0;
                memset(p,0,sizeof(p));
                memset(q,0,sizeof(q));
                scanf("%lld%lld%lld%lld",&a,&b,&r,&c);
                for(i=0;i<=a-1;i++)
                 for(j=0;j<=b-1;j++)
                    scanf("%lld",&p[i][j]);
                if(a==r&&b==c){
                    for(i=0;i<=a-1;i++)
                     for(j=0;j<=b-1;j++)
                       m+=p[i][j];
                    printf("%lld\n",m);
                }
                else if(r==1&&c==1){
                    m=p[0][0];
                    for(i=0;i<=a-1;i++)
                     for(j=0;j<=b-1;j++)
                      if(p[i][j]>m)
                         m=p[i][j];
                    printf("%lld\n",m);
                }
                else{
                    n=0;
                    for(s=0;s<=b-c;s++){
                      for(i=0;i<=a-r;i++){
                        for(j=i;j<=r+i-1;j++)
                            for(k=s;k<=c+s-1;k++)
                                q[n]+=p[j][k];
                        n++;
                      }
                    }
                    sort(q,q+n);
                    printf("%lld\n",q[n-1]);
                }
            }
     }
     return 0;
}



宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~dalao们点个关注呗~~

欢迎访问https://blog.csdn.net/lxt_Lucia~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
股票最大收益问题是一道经典的动态规划问题。假设有一个数组prices,其中prices[i]表示第i天股票的价格,你可以进行任意次数的交易,但必须先买入才能卖出。请计算在此期间能够获得的最大收益。 该问题可以通过动态规划算法来解决,具体步骤如下: 1. 定义状态:定义状态dp[i][j]表示第i天结束时,手上有股票状态为j(0表示没有股票,1表示持有股票)的最大收益。 2. 定义状态转移方程:考虑第i天的状态,可以是前一天持有股票的状态,或者前一天没有股票,但选择在第i天买入股票的状态。因此,状态转移方程为: dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]) 3. 确定边界条件:第0天结束时,手上没有股票的最大收益为0,手上持有股票的最大收益为-prices[0]。 dp[0][0] = 0 dp[0][1] = -prices[0] 4. 计算最优解:最终的最大收益为dp[n-1][0],其中n为prices数组的长度。 代码实现如下: ```python def maxProfit(prices): n = len(prices) # 定义状态 dp = [[0]*2 for _ in range(n)] # 初始化边界条件 dp[0][0] = 0 dp[0][1] = -prices[0] # 计算状态转移 for i in range(1, n): dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]) # 返回最大收益 return dp[n-1][0] ``` 该算法的时间复杂度为O(n),空间复杂度为O(n),其中n为prices数组的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值