文章

10

粉丝

143

获赞

3

访问

55.5k

头像
高维数组降维+最短连续子序列问题
P1285 上海交通大学机试题
发布于2022年2月27日 14:48
阅读数 6.2k

借鉴大佬的思路https://blog.csdn.net/Jaster_wisdom/article/details/52153685

 

首先思考在一维数组中,若想求元素和大于等于K的子数组的最小长度,可以怎么做?

可以使用两个指针start,end,初始时都指向0。end后移直到sum>=K,然后start开始后移,直到sum<K时start停止后移,end开始后移...

如此往复直到end>=一维数组长度;在这个过程中,当sum>=K时,每次start后移之后,判断sum是否仍满足条件,并更新最小长度res=min(res,end-start+1)

 

在本题中,可以将任意两列i,j之间的所有列合并,降维成一维数组,然后求其最小长度,之后再用其最小长度temp乘以(j-i+1)即为子矩阵的个数。

如此遍历完整个矩阵,保留所求子矩阵即可。

 

细节1:当整个矩阵的和sum<K时,直接输出-1

        for(int i=0;i<N;i++)
            for(int j=0;j<M;j++)
            {
                cin>>matrix[i][j];
                sum+=matrix[i][j];
            }
        if(sum<K) cout<<-1<<endl;

 

细节2:在main函数中遍历时,i表示起始列,j表示终止列,所以i的枚举范围是0~M,j的枚举范围是i~M

            for(int i=0;i<M;i++)
                for(int j=i;j<M;j++)
                {
                    fill(num,num+MAXN,0);
                    merge(i,j);
                    int temp=FindShortest();
             ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发