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

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

#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. 我的第一个jquery插件:下拉多选框

    <!DOCTYPE HTML> <html> <head> <title> New Document </title> <meta n ...

  2. [Codeforces137B]Permutation(贪心?思路?,水题)

    题目链接:http://codeforces.com/contest/137/problem/B 给n个数字,要求修改成1~n的全排列数中的一个,修改的次数尽可能少,问最少需要修改几个数. 记下数组里 ...

  3. android上的缓存、缓存算法和缓存框架

      1.使用缓存的目的 缓存是存取数据的临时地,因为取原始数据代价太大了,加了缓存,可以取得快些.缓存可以认为是原始数据的子集,它是从原始数据里复制出来的,并且为了能被取回,被加上了标志. 在andr ...

  4. BZOJ_1627_[Usaco2007_Dec]_穿越泥地_(bfs)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1627 网格图,给出起点,终点,障碍,求最短路. 分析 简单的宽搜. #include < ...

  5. wince和window mobile winphone

    windows mobile是微软在2000年左右推出的针对移动平台的操作系统,这个系统一直使用到三年前,微软开始启用metro界面,将windows mobile改名为windows phone. ...

  6. javascript中的关键字和保留字

    javascript中关键字的问题,将名称替换了下,确实就没有问题了.现在将它的关键字和保留字贴出来,便于日后查看和避免在次出现类似的问题. 1 关键字breakcasecatchcontinuede ...

  7. JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)

    近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的By ...

  8. poj 2230 Watchcow(欧拉回路)

    关键是每条边必须走两遍,重复建边即可,因为确定了必然存在 Euler Circuit ,所以所有判断条件都不需要了. 注意:我是2500ms跑过的,鉴于这道题ac的code奇短,速度奇快,考虑解法应该 ...

  9. POJ 3352 Road Construction(边双连通分量,桥,tarjan)

    题解转自http://blog.csdn.net/lyy289065406/article/details/6762370   文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...

  10. Java [Leetcode 278]First Bad Version

    题目描述: You are a product manager and currently leading a team to develop a new product. Unfortunately ...