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

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

#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. Android用户界面布局(layouts)

    Android用户界面布局(layouts) 备注:view理解为视图 一个布局定义了用户界面的可视结构,比如activity的UI或是APP widget的UI,我们可以用下面两种方式来声明布局: ...

  2. 用imagemagick和tesseract-ocr破解简单验证码

    用imagemagick和tesseract-ocr破解简单验证码 Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊. 准备工作: 1.安装tesseract-ocr sudo apt ...

  3. makefile的常用规则

    一.前言 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 二.正文 1 ...

  4. [LeetCode#267] Palindrome Permutation II

    Problem: Given a string s, return all the palindromic permutations (without duplicates) of it. Retur ...

  5. Java 比较两张图片的相似度

    import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; /** * 比较两张图片 ...

  6. Android中View转换为Bitmap及getDrawingCache=null的解决方法

    1.前言 Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片:Coverflow中需要把一页一 页的view转换为Bitmap.以便实现复杂的图形效果 ...

  7. SPRING STS Virgo OSGI 开发一 : bundle 项目的创建

    1. Spring STS 下载地址  (spring 最近改了站点 暂时不是太熟悉)     http://spring.io/tools/sts/all 2. 下载 Virgo 插件    htt ...

  8. UVa 10735 (混合图的欧拉回路) Euler Circuit

    题意: 给出一个图,有的边是有向边,有的是无向边.试找出一条欧拉回路. 分析: 按照往常的思维,遇到混合图,我们一般会把无向边拆成两条方向相反的有向边. 但是在这里却行不通了,因为拆成两条有向边的话, ...

  9. UVa 1636 (概率) Headshot

    既然是第一道概率题,就正儿八经地分析一下吧. 题意: 有一个左轮枪,里面随机装了或者没装子弹,用一个01序列表示.现在已知扣动第一次扳机没有子弹,问是继续扣动扳机还是随机转动一下再扣,那种选择使得第二 ...

  10. 漫谈 polling 和 Websocket

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...