《算法设计》课程报告--三角形问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《算法设计》课程报告

课题名称:算法设计

课题负责人名(学号): -- 同组成员名单(角色): --

指导教师: ---

评阅成绩:

评阅意见:

提交报告时间:2014年 6 月 17 日

三角形问题

计算机科学与技术专业

学生-- 指导老师---

[题目描述] 给定一个由n 行数字组成的数字三角形,如下图所示。试设计一个算法,计算出从三角形的顶到底的一条路径,使该路径经过

的数字总和最大。

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

编程任务:对于给定的由n 行数字组成的数字三角形,编程计算从三角形的顶到底的路径经过的数字和的最大值。

数据输入:由文件input.txt 提供输入数据。文件的第 1 行是数字三

角形的行数n,1≤n≤100。接下来n 行是数字三角形各行中的数字。所有数字在0~99 之间。

结果输出:程序运行结束时,将计算结果输出到文件output.txt 中。

文件第 1 行中的数是计算出的最大值。

输入文件示例输出文件示例

Input.txt output.txt

5 30

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

[关键词] 数字三角形数字和路径

[算法分析]

采用分治算法自底向上递推即可,二维数组v存放输入的三角形序列,二维数组submax[i][j]保存第i层第j列的所有子树的值,很容易得出递推式为submax[i][j]=v[i][j]+ max{submax[i+1][j],submax[i+1][j+1]}; 递推得到的submax[1][1]即为所求最大值

时间复杂度为O(n^2)

空间复杂度为O(n^2)

[程序实现]

#include

#include

#include

#include

#include

#include

using namespace std;

#define MAXSIZE 10

int MaxTriangle(int v[MAXSIZE][MAXSIZE] ,int n){

int submax[MAXSIZE][MAXSIZE]={0};

for(int i=1;i<=n;++i)

submax[n][i] = v[n][i];

for(int k=n-1;k>=1;--k){

for(int r=1;r<=k;++r){

submax[k][r] = v[k][r] + (submax[k+1][r] > submax[k+1][r+1] ? submax[k+1][r] : submax[k+1][r+1]);

}

}

/*

for(int u=1;u<=n;++u){

for(int v=1;v<=u;++v){

cout<

}

cout<

}

*/

return submax[1][1];

}

int main(){

int n;

int v[MAXSIZE][MAXSIZE];

cout<<"Please input the input file path:"<

char strPath[63];

while(scanf("%s",strPath)==1){

ifstream fin(strPath);

cout<<"Please input the output file path:"<

cin>>strPath;

ofstream fout(strPath);

if(fin.good() && fout.good()){

fin>>n;

for(int i=1;i<=n;++i){

for(int j=1;j<=i;++j){

fin>>v[i][j];

}

}

int maxValue = MaxTriangle(v,n);

fout<

fout.close();

fin.close();

}

else{

cout<<"Open file error!"<

exit(0);

}

cout<

}

return 0;

}[运行结果]

参考文献

[1] 王晓东.计算机算法设计与分析.--3版.--北京:电子工业出版社2007.5

相关文档
最新文档