《算法设计》课程报告--三角形问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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