homework-02,第二次作业——寻找矩阵最大子序列和
经过漫漫漫~~~~~~~~~~~~~~长的编译和调试,第二次作业终于告一段落了
先放出源码,思路后面慢慢道来
#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,第二次作业——寻找矩阵最大子序列和的更多相关文章
- 耿丹CS16-2班第二次作业汇总
-- Deadline: 2016-09-28 12:00 -- 作业内容:http://www.cnblogs.com/huangjunlian/p/5891726.html -- 第二次作业总结: ...
- 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
- 集大1513 & 1514班 软件工程第二次作业评分与点评
谢谢按时完成作业的同学. 请大家在今后的作业中多思考,认真完成并注意作业的原创性. 学号 作业标题 作业地址 提交日期 分数 201521121087 微信APP简要分析 http://www.cnb ...
- OO第二单元作业小结
前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...
- 【BUAA-OO】第二单元作业总结
第二单元作业总结 ——电梯恐惧症患者的极限自救 一. 第一次作业程序分析 1. 设计策略简略分析 线程:主线程.输入线程和电梯线程,另有一个持有请求队列的调度器,一个对输入进行处理的Req ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- 广州商学院16级软工一班&二班-第二次作业成绩
作业地址 https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 https://edu.cnblogs.com/campus/gzc ...
- C语言--第二周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1026 一.评分要求 要求1 阅读指定博客+阅读收获+例子.(5分) 要求2 ...
- 第二次作业hzw
第二次作业 | GIT地址 | 地址链接 | |--|--| |GIT用户名 | BRYANT333 | |学号后五位|24240| |博客地址|我的博客| |作业链接|第二次作业地址| 一.环境配置 ...
随机推荐
- (2)WinForm中改变Tab选项卡的顺序
Tab选项卡选中,在其属性中找到TabPages这个属性.点进去,可以通过上下移动标签卡改变标签卡的顺序.
- java-基础练习题
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...
- TUXEDO错误解决方案
错误1: root@tfjus:/opt/tuxedo/simpapp# buildclient -f simpcl.c -o simpcl simpcl.c: In function 'main': ...
- Android Studio修改包名和applicationId的方法
背景: 如果新做的项目跟以前做的某一个项目十分相似,那么一个简单的方法就是把原来项目拷贝一份,然后修改代码,但是这样包名还是原来项目的包名,还有如果想在同一台手机上同时安装新做的app和原来的app会 ...
- BZOJ1272: [BeiJingWc2008]Gate Of Babylon
题解: 多重集合的组合数?还是0-m?有些元素有个数限制? 多重集合的组合数可以插板法,0-m直接利用组合数的公式一遍求出来,个数限制注意到只有15个,那我们就暴力容斥了 AC了真舒畅.. 注意开lo ...
- ASP.NET MVC ActionResult的实现
1.11种ActionResult 在System.Web.Mvc命名空间下: ActionResult是一个抽象类, 在Action中返回的都是其派生类.下面是我整理的ASP.NET MVC 1.0 ...
- Android Studio 我常用快捷键
0. Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类 1. 重载方法 Ctrl+O 2.Ctrl+shift+Enter:自动匹配相对应的语法结构,比如if,do-while,t ...
- [转] Asp.net Report Viewer 简单实例
原文链接:http://www.aspsnippets.com/Green/Articles/ASPNet-Report-Viewer-control-Tutorial-with-example.as ...
- erl0004 - ets 安全遍历
safe_fixtable(Tab, true|false) -> true Types: Tab = tid() | atom() 锁定set,bag和 ...
- Oracle AWR报告自动生成并ftp脚本
脚本主要由以下几个部分组成: awr.sql 用来在sqlplus 中执行的脚本,该脚本从网上直接找的. awr.sh 用来调用sqlplus来生成awr报告. ftp.sh 用来打包压缩每天生成的a ...