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| |博客地址|我的博客| |作业链接|第二次作业地址| 一.环境配置 ...
随机推荐
- Linux 线程属性函数总结
1.初始化一个线程对象的属性 int pthread_attr_init(pthread_attr_t *attr); 返回值:若是成功返回0,否则返回错误的编号 形 参: attr 指向一个线程属性 ...
- cmd修改系统时间
time 11:15:00 修改时间 date 2015/11/25 修改日期
- R programming, In ks.test(x, y) : p-value will be approximate in the presence of ties
Warning message: In ks.test(x, y) : p-value will be approximate in the presence of ties The warnin ...
- linux/unix网络编程之 select
转自http://www.cnblogs.com/zhuwbox/p/4221934.html linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 selec ...
- Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工 ...
- Android中使用广播机制退出多个Activity
谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多. 在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法. ...
- UVa 1475 (二分+半平面交) Jungle Outpost
题意: 有n个瞭望塔构成一个凸n边形,敌人会炸毁一些瞭望台,剩下的瞭望台构成新的凸包.在凸多边形内部选择一个点作为总部,使得敌人需要炸毁的瞭望塔最多才能使总部暴露出来.输出敌人需要炸毁的数目. 分析: ...
- 【转】.. Android应用内存泄露分析、改善经验总结
原文网址:http://wetest.qq.com/lab/view/107.html?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.194 ...
- 【转】Linux时间函数之gettimeofday()函数之使用方法
原文网址:http://blog.csdn.net/tigerjibo/article/details/7039434 一.gettimeofday()函数的使用方法: 1.简介: 在C语言中可以使用 ...
- 【转】ios app 应用内购买配置完全指南
转自:http://blog.sina.com.cn/s/blog_4b55f6860100sbfb.html 第一印象觉得In-App Purchase(简称IAP)非常简单.Apple提供的大量文 ...