《算法设计》课程报告
课题名称:算法设计
课题负责人名(学号): -- 同组成员名单(角色): --
指导教师: ---
评阅成绩:
评阅意见:
提交报告时间: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 <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <algorithm>
#include <string>
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<<submax[u][v]<<" ";
}
cout<<endl;
}
*/
return submax[1][1];
}
int main(){
int n;
int v[MAXSIZE][MAXSIZE];
cout<<"Please input the input file path:"<<endl;
char strPath[63];
while(scanf("%s",strPath)==1){
ifstream fin(strPath);
cout<<"Please input the output file path:"<<endl;
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<<maxValue<<endl;
fout.close();
fin.close();
}
else{
cout<<"Open file error!"<<endl;
exit(0);
}
cout<<endl<<endl<<"Please input the input file path:"<<endl;
}
return 0;
}[运行结果]
参考文献
[1] 王晓东.计算机算法设计与分析.--3版.--北京:电子工业出版社2007.5。