经过漫漫漫~~~~~~~~~~~~~~长的编译和调试,第二次作业终于告一段落了

先放出源码,思路后面慢慢道来

#include<stdio.h>
#include<stdlib.h>
int find(int num,int &s,int &max)
{
s+=num;
if(s<num)s=num;
if (max<s) max=s; } int main()
{
int s,max;
int x,y,a[][],b[][],i,j,t,n,sum,flag=;
char c;
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&y);
scanf("%d",&x);
for(i=;i<y;i++)
{
for(j=;j<x-;j++)
{
if (!(scanf("%d",&a[i][j]))) flag=-;
scanf("%c",&c);
if (c!=',') flag=-;
}
scanf("%d",&a[i][x-]);
}
for(i=;i<x;i++)
{
n=;
for(j=;j<y;j++)
{
sum=;
for(t=j;t>=;t--)
{
sum=sum+a[t][i];
b[n][i]=sum;
n++;
} }
}
max=b[][];
for(i=;i<;i++)
{
s=b[i][];
for(j=;j<x;j++)
find(b[i][j],s,max);
}
if (flag==-) printf("error!");
else printf("%d",max); }

以下是测试过程截图

input.TXT内容如下

输出结果为28,放在同文件夹下的output.txt

算法的实现原理:

在刚接手这个题目的时候,我无从下手,不知道如何将一个一维的序列脱战到二维。

几番思考后,我仔细观察了结构,发现任何二位的图形其实可以压缩成为一维的一条线——这就是我解开这道题目谜底的方法

也就是说在二位的纵轴上,我把各行数字分别求和,让这个二位数组的任何情况都化简为一维数组来处理,这样答案就显而易见了

关键代码是如下这段

   for(i=;i<x;i++)
{
n=;
for(j=;j<y;j++)
{
sum=;
for(t=j;t>=;t--)
{
sum=sum+a[t][i];
b[n][i]=sum;
n++;
} }
}

这是将二维数组逐行求和,并将得到的新的“和数组”,也可以叫“压缩数组”放在新建的数组b中

数组b的行数需要很大,以便存下所有的a的行数的组合情况,然而列数只需要保持与数组a相等即可

举个简单的例子来说

比如有个输入是:

2

3

1,2,3

4,5,6

那么我在进行压缩数组以后,得到的数组b为

1,2,3

4,5,6

5,7,9

很显然可以看到,第三行5,7,9是第一行和第二行的和

在计算矩阵的子序列和的时候只需要逐行计算子序列的和

当计算到5,7,9 的和的时候实际上是在计算

1,2,3

4,5,6

这两个数组的和

这就是我“压缩矩阵”思路的原理

int find(int num,int &s,int &max)
{
s+=num;
if(s<num)s=num;
if (max<s) max=s; }

这段代码是一维数组的动态规划,只需要将数组b中的一行取出,套用这个动态规划算法得到改行数组的最大值,并b数组中所有行的最大值取最大,就是最终的答案

关于错误输入返回error,我设计了一种输入的行数或者列数大于你已经输入的行数或者列数的情况

for(i=;i<y;i++)
{
for(j=;j<x-;j++)
{
if (!(scanf("%d",&a[i][j]))) flag=-;
scanf("%c",&c);
if (c!=',') flag=-;
}
scanf("%d",&a[i][x-]);
}

flag=-1时,返回error,其他情况返回答案

当然,还有行数或者列数小于你已经输入的行数或者列数的情况,我没有找到好的方法实现,就仅此而已。

综上,这个算法已经能够解决第二题的二维矩阵,对于第一题的一维矩阵这种特例就更不在话下了

因此第一第二题得到了解决

第三题百思得不到其解,只能放弃!

第四、五题解法已经有了答案

这两道题目看似是三维方向的拓展,其实仔细想想就是一个简单的二维问题的延伸

所谓的头尾相接,上下相接,轮胎形状,这些只需要我们在二维矩阵上面做些文章即可

也就是把原有的二维矩阵拓展成为4个二维矩阵,即把原有矩阵纵向复制一份,使它上下相接,横向复制一份使它左右相连,对角线方向复制一份,即可构成轮胎状。

程序代码还是上面的代码

只是在的A[I][J]上做做手脚,变成A[2I][2J],按上面的方法进行拓展,得到的A[2I][2J]再利用程序进行计算即可。

拿例子来说

这是老师给出的一个原始矩阵

我将它拓展为

只需要运算下面这张拓展矩阵就能得到“轮胎”的正确答案了

注:在运算的过程中我们要有个限制就是在拓展矩阵中得到的最大的矩阵是x行*y列,超过这个的为错误

在计算压缩矩阵的时候需要相应的限制即可

这是我第二次作业,可能有各种各样的漏洞,但是确实是用心,花了不少时间去做的,希望助教老师给我一个满意的分数,谢谢老师,辛苦了

homework-02,第二次作业——寻找矩阵最大子序列和的更多相关文章

  1. 耿丹CS16-2班第二次作业汇总

    -- Deadline: 2016-09-28 12:00 -- 作业内容:http://www.cnblogs.com/huangjunlian/p/5891726.html -- 第二次作业总结: ...

  2. 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)

    相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...

  3. 集大1513 & 1514班 软件工程第二次作业评分与点评

    谢谢按时完成作业的同学. 请大家在今后的作业中多思考,认真完成并注意作业的原创性. 学号 作业标题 作业地址 提交日期 分数 201521121087 微信APP简要分析 http://www.cnb ...

  4. OO第二单元作业小结

    前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...

  5. 【BUAA-OO】第二单元作业总结

    第二单元作业总结 ——电梯恐惧症患者的极限自救 一.   第一次作业程序分析 1.     设计策略简略分析 线程:主线程.输入线程和电梯线程,另有一个持有请求队列的调度器,一个对输入进行处理的Req ...

  6. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  7. 广州商学院16级软工一班&二班-第二次作业成绩

    作业地址 https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 https://edu.cnblogs.com/campus/gzc ...

  8. C语言--第二周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1026 一.评分要求 要求1 阅读指定博客+阅读收获+例子.(5分) 要求2 ...

  9. 第二次作业hzw

    第二次作业 | GIT地址 | 地址链接 | |--|--| |GIT用户名 | BRYANT333 | |学号后五位|24240| |博客地址|我的博客| |作业链接|第二次作业地址| 一.环境配置 ...

随机推荐

  1. ActiveMQ集群(2)

    ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要有两种:Master-Slave和Broker Cluster. 1.Master-Slave ...

  2. hdu 4973 A simple simulation problem. (线段树)

    题目链接 题意: 给定n长的序列 m个操作 序列默认为 1, 2, 3···n 操作1:D [l,r] 把[l,r]区间增长 :( 1,2,3,4 进行 D [1,3]变成 1,1,2,2,3,3,4 ...

  3. MSSQL大全

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  4. 实现窗口逐渐增大(moveTo(),resizeTo(),resizeBy()方法)

    moveTo()方法格式:window.moveTo(x,y); 功能:将窗口移动到指定坐标(x,y)处; resizeTo()方法格式:window.resizeTo(x,y); 功能:将当前窗口改 ...

  5. ti processor sdk linux am335x evm /bin/setup-host-check.sh hacking

    #!/bin/sh # # ti processor sdk linux am335x evm /bin/setup-host-check.sh hacking # 说明: # 本文主要对TI的sdk ...

  6. HDU 1272 小希的迷宫 (水题)

    题意: 其实就是让你判断一个图是否为树,要求不能有孤立的点(没有这中情况),且只能有1个连通图,且边数+1=点数,且每个点都有边(不可能只有1个点出现). 思路: 有可能出现连续的4个0,也就是有测试 ...

  7. 基于phpExcel写的excel类

    <?php /* * 类的功能 * 传入二位数组导出excel * 传入excel 导出二位数组 * @author mrwu */ require('PHPExcel.php'); requi ...

  8. apache开源项目 -- tez

    为了更高效地运行存在依赖关系的作业(比如Pig和Hive产生的MapReduce作业),减少磁盘和网络IO,Hortonworks开发了DAG计 算框架Tez.Tez是从MapReduce计算框架演化 ...

  9. ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片

    这里请注意,在编译ffmpeg时,不要使用--disable-devices选项. 使用 --enable-encoder=rawvideo --enable-decoder=rawvideo 启用r ...

  10. Oracle行列互换 横表和纵表

    /* 在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换. 比如有如下数据: ID NAME KECHENG CHENGJI -- ---------- ------ ...