搞了6个小时individual project...看看博客做一做第一次现代程序设计作业

1) 建立 GitHub 账户, 把课上做的 “最大子数组之和” 程序签入

我的github地址是https://github.com/oldoldb,以前没有用过各种不熟练啊....代码我放到<现代程序设计课后作业>这个repository里了,是昨天完成的在hdu和poj上找的5道关于一维和二维情况的最大子数组&最大子矩阵问题的练习,具体的解题报告参见第一篇博客:http://www.cnblogs.com/oldoldb/p/3312195.html

2) 在 cnblogs.com 建立自己的博客。 写博客介绍自己的 GitHub 账户.  并把博客地址写到这个博客的留言。这样TA 可以收集信息

博客地址是http://www.cnblogs.com/oldoldb

3) 搞到一本教科书 (三本中选一本), 并在博客中说明自己选的是哪一本。

在csdn和新浪爱问上搞到了三本书的电子版...回头大体浏览一下再决定将哪本书作为教科书吧...吐槽一下移山之道没有找到免费的电子版。。。好吧我尊重原创

PS:今天《移山之道》,感觉。。。1是好多开发方法开发工具什么的我不用现在也看不懂。。 2是这本书。。其实真的不太适合做教科书吧。。说真的。。。那些打趣的东西完全没有必要的。。。改天浏览一下其他两本书。。

4) 阅读下面的博客:

  1. 个人软件开发流程: Personal Software Process,
  2. 程序效能分析
  3. 单元测试 (在最小的编程单元上保证正确性) & 回归测试 (保证程序在修改的过程中, 原有的功能保持稳定 )
  4. 技能的反面

大体读了一下。。虽然软件开发的很多东西自己根本不懂。。平时的编程也仅限于算法和数据结构方面。。。

5) 在自己的博客上描述自己是怎么设计 “最大子数组之和”这个程序的, 和正确的解法有哪些差距。

同第一条,具体的解题报告参见第一篇博客:http://www.cnblogs.com/oldoldb/p/3312195.html

为了

邹老师的第一门课上小测了最大子矩阵的问题,课堂上只想到了O(n^2*m^2)的算法

后来翻《编程之美》的时候翻到了这道题...今天下午研究了一下,到OJ上切了几道题,熟悉了动态规划在这个问题中的应用.

一.最大子段和

书上已经将这种思想讲的很透彻,对基本的最大子段和的练习可以参照hdu1003题http://acm.hdu.edu.cn/showproblem.php?pid=1003,唯一的一点变形是这道题要求求出最大字段的起始位置和终止位置.

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cstdlib>
5 #include<algorithm>
6 #define INF 0x3f3f3f3f
7 using namespace std;
8 const int maxn=100005;
9 int map[maxn];
10 int ans;
11 int begin;
12 int end;
13 int n;
14 void getmap()
15 {
16 for(int i=1;i<=n;i++)
17 {
18 cin>>map[i];
19 }
20 }
21 void work()
22 {
23 int tempsum=0;
24 int tmpbegin=1;
25 for(int i=1;i<=n;i++)
26 {
27 tempsum+=map[i];
28 if(tempsum>ans)
29 {
30 ans=tempsum;
31 begin=tmpbegin;
32 end=i;
33 }
34 if(tempsum<0)
35 {
36 tempsum=0;
37 tmpbegin=i+1;
38 }
39
40 }
41 }
42
43 int main()
44 {
45 int T;
46 cin>>T;
47 for(int tt=1;tt<=T;tt++)
48 {
49 ans=-INF;
50 cin>>n;
51 getmap();
52 work();
53 cout<<"Case "<<tt<<":"<<endl;
54 cout<<ans<<" "<<begin<<" "<<end<<endl;
55 if(tt<T)
56 {
57 cout<<endl;
58 }
59 }
60 return 0;
61 }

关于最大子段和有一种变形是最大m子段和,http://acm.hdu.edu.cn/showproblem.php?pid=1024,就是在原有的基础上求m段子段的和,这里建立动态规划方程,dp[i][j]表示前j个数(包括第j个数)组成i段的和的最大值,那么根据第j个数是否独立成组得到转移方程为dp[i][j]=max(dp[i-1][j-1]+a[j],dp[i-1][k]+a[j]),0<k<j,这里dp[i][]只和dp[i-1][]有关,用一维数组就可以表示,同时dp[i-1][k]表示1~j-1中构成i-1组的最大值,即前一组的值,那么可以在循环中求出,所以复杂度为O(n*m)

 1 /*
2 dp[i][j]前j个数(包括第j个数,组成i组的和的最大值
3 dp[i][j]=max(dp[i-1][j-1]+map[j],dp[i-1][k]+map[j]),0<k<j
4 即根据第j个数是否单独成组划分状态
5 前i组仅与前i-1组有关,这里用一维数组就好
6 而dp[i-1][k]其实就是上一组中从0-j-1中划分为i-1组的最大值
7 */
8 #include<iostream>
9 #include<cstdio>
10 #include<cstring>
11 #include<cstdlib>
12 #include<algorithm>
13 #define INF 0x3f3f3f3f
14 using namespace std;
15 const int maxn=1000005;
16 __int64 map[maxn];
17 __int64 dp[maxn];
18 __int64 prev[maxn];
19 __int64 ans;
20 int m;
21 int n;
22 void getmap()
23 {
24 dp[0]=0;
25 prev[0]=0;
26 for(int i=1;i<=n;i++)
27 {
28 scanf("%I64d",&map[i]);
29 dp[i]=0;
30 prev[i]=0;
31 }
32 }
33 void work()
34 {
35 for(int i=1;i<=m;i++)
36 {
37 ans=-INF;
38 for(int j=i;j<=n;j++)
39 {
40 dp[j]=max(dp[j-1],prev[j-1])+map[j];
41 prev[j-1]=ans;
42 ans=max(ans,dp[j]);
43 }
44 }
45 }
46 int main()
47 {
48 while(scanf("%d%d",&m,&n)!=EOF)
49 {
50 getmap();
51 work();
52 printf("%I64d\n",ans);
53 }
54 return 0;
55 }

根据这道题那么poj2593,http://poj.org/problem?id=2593,就很容易解决了...就是将m替换为两段就好

 1 /*
2 dp[i][j]前j个数(包括第j个数,组成i组的和的最大值
3 dp[i][j]=max(dp[i-1][j-1]+map[j],dp[i-1][k]+map[j]),0<k<j
4 即根据第j个数是否单独成组划分状态
5 前i组仅与前i-1组有关,这里用一维数组就好
6 而dp[i-1][k]其实就是上一组中从0-j-1中划分为i-1组的最大值
7 */
8 #include<iostream>
9 #include<cstdio>
10 #include<cstring>
11 #include<cstdlib>
12 #include<algorithm>
13 #define INF 0x3f3f3f3f
14 using namespace std;
15 const int maxn=1000005;
16 int map[maxn];
17 int dp[maxn];
18 int prev[maxn];
19 int ans;
20 int m;
21 int n;
22 void getmap()
23 {
24 dp[0]=0;
25 prev[0]=0;
26 for(int i=1;i<=n;i++)
27 {
28 scanf("%d",&map[i]);
29 dp[i]=0;
30 prev[i]=0;
31 }
32 }
33 void work()
34 {
35 for(int i=1;i<=m;i++)
36 {
37 ans=-INF;
38 for(int j=i;j<=n;j++)
39 {
40 dp[j]=max(dp[j-1],prev[j-1])+map[j];
41 prev[j-1]=ans;
42 ans=max(ans,dp[j]);
43 }
44 }
45 }
46 int main()
47 {
48 while(scanf("%d",&n)!=EOF&&n)
49 {
50 m=2;
51 getmap();
52 work();
53 printf("%d\n",ans);
54 }
55 return 0;
56 }

二.最大子矩阵

最大子矩阵的算法就是将第k列中第i行到j行的数的和求出,然后套用一维的算法就好

我拿poj1050,http://poj.org/problem?id=1050,做了练习

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cstdlib>
5 #include<algorithm>
6 #define INF 0x3f3f3f3f
7 using namespace std;
8 const int maxn=105;
9 int map[maxn][maxn];
10 int sum[maxn][maxn];
11 int ans;
12 int n;
13 void getmap()
14 {
15 for(int i=1;i<=n;i++)
16 {
17 for(int j=1;j<=n;j++)
18 {
19 cin>>map[i][j];
20 }
21 }
22 }
23 void getsum()
24 {
25 memset(sum,0,sizeof(sum));
26 for(int i=1;i<=n;i++)
27 {
28 for(int j=1;j<=n;j++)
29 {
30 sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+map[i][j];
31 }
32 }
33 }
34 void work()
35 {
36 ans=-INF;
37 for(int i=1;i<=n;i++)
38 {
39 for(int j=i;j<=n;j++)
40 {
41 int start=sum[j][n]-sum[i-1][n]-sum[j][n-1]+sum[i-1][n-1];
42 int all=start;
43 for(int k=n-1;k>=1;k--)
44 {
45 if(start<0)
46 {
47 start=0;
48 }
49 start+=sum[j][k]-sum[i-1][k]-sum[j][k-1]+sum[i-1][k-1];
50 all=max(all,start);
51 }
52 ans=max(ans,all);
53 }
54 }
55 }
56 int main()
57 {
58 while(cin>>n)
59 {
60 getmap();
61 getsum();
62 work();
63 cout<<ans<<endl;
64 }
65 return 0;
66 }

暂时只能想到这些,以后遇到该问题的变形,比如像课后扩展那样对于矩阵可以首尾相连,二维扩展到三维、四维等等的问题,我会继续在这里更新。

关于一些作业要求:

程序的架构和思路:就是一个dp,dp[i]为前i个数的最大和(当然这里因为参照了《编程之美》写的是从后向前dp,不过思想都是一样的,在第二次作业中会用从前向后dp),状态转移方程为dp[i]=max{dp[i-1]+a[i],a[i]}

心得:心得就是《编程之美》这本书上关于最大子数组的O(n)解法其实饶了一个弯。。并不是那么简洁。。完全可以直接从前向后dp

时间消耗:这个问题比较简单,用了一个下午的时间来写代码+找题目+初步写blog,现在在按照作业要求修改blog

开发效率分析:这个。。。。是什么意思。。。复杂度是O(n),还有么。。。

运行结果:在github上有详细的测试数据和代码

PS:关于这部分的代码我在第二次作业一开始对于简单最大子数组问题的复习中改写了一下。。。可惜被不小心删掉了。。。貌似不能通过数据恢复恢复了?我改天做第二次作业的时候再完善一下。。

现代程序设计 homework-01的更多相关文章

  1. 阅读摘录《javascript 高级程序设计》01

    前言: 因为工作需要,所以开始主攻前台JS方面的技术.在以前的工作中,使用过这门脚本语言.但是都是比较凌乱的,用到什么学什么,只是为了实现业务,而去使用. 不会考虑到代码优化,封装对象等.今次特意借了 ...

  2. javascript高级程序设计--笔记01

    概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型( ...

  3. 标准C程序设计七---01

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  4. 现代程序设计homework——04

    题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...

  5. Using Vertex Texture Displacement for Realistic Water Rendering

    http://blog.csdn.net/soilwork/article/details/709869 Using Vertex Texture Displacement for Realistic ...

  6. 软工+C(9): 助教指南,持续更新...

    上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...

  7. 20145218 《Java程序设计》第01次实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.08 实验名称:Java开发环境的熟悉(Linux + Eclipse) 实 ...

  8. 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB

    走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...

  9. 20145219 《Java程序设计》第01周学习总结

    20145219 <Java程序设计>第01周学习总结 教材学习内容总结 软件分类:系统软件(DOS.Windows.Linux等).应用软件(扫雷.QQ等) 人机交互方式:图形化界面.命 ...

  10. HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))

    度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. tomcat健康检查监控脚本

    #!/bin/sh#自动监控tomcat脚本并且执行重启操作#获取tomcat_IDTomcatID=`ps -ef|grep tomcat|grep -v "grep"|grep ...

  2. 关于var与function的解析顺序问题

    先给几段代码,看看你能知道运行结果不 function example1() { var f = function() {return 1;}; return f; var f = function( ...

  3. [国家集训队]JZPFAR

    嘟嘟嘟 k-d tree模板之二:查询第k大距离.(所以是怎么上黑的) 因为k-d tree的查询就是暴力嘛,所以我就想到了一个很暴力的做法:每一次查询用一个长度为k的优先队列维护.按距离递增,编号递 ...

  4. mvn 的 provided 以及 test等等 还有git团队开发技巧

    mvn 的 provided 以及 test等等 还有git团队开发技巧

  5. PAT A1121 Damn Single (25 分)——set遍历

    "Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...

  6. python3.6.4源码安装

    该脚本适合centos6和ubuntu用,关于debian可以根据脚本中的范例自己添加 微笑哥与你每天进步一点点 #!/bin/bash##Check systemcheck_sys(){ local ...

  7. VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维

    VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维 2016年01月14日 11:40:28 博博有个大大大的Dream 阅读数:9375   版权声明:本文为博主原创文章,未经博 ...

  8. Elastic 技术栈之快速入门

    Elastic 技术栈之快速入门 概念 ELK 是什么 ELK 是 elastic 公司旗下三款产品 ElasticSearch .Logstash .Kibana 的首字母组合. ElasticSe ...

  9. Luogu4886 快递员 点分治

    传送门 淀粉质好题啊qaq 我们先考虑随便选择一个点作为邮递中心,通过移动邮递中心找到更优的位置.将路径最大值求出,并将路径最大值对应的那一些路径拿出来考虑.可以知道,如果说这些路径中存在一条经过当前 ...

  10. CF1097D Makoto and a Blackboard 积性函数、概率期望、DP

    传送门 比赛秒写完ABC结果不会D--最后C还fst了qwq 首先可以想到一个约数个数\(^2\)乘上\(K\)的暴力DP,但是显然会被卡 在\(10^{15}\)范围内因数最多的数是\(978217 ...