ACM实验九陈俊鸿.docVIP

  • 5
  • 0
  • 约2.55千字
  • 约 4页
  • 2017-06-08 发布于北京
  • 举报
桂林电子科技大学 数学与计算科学学院综合性、设计性实验报告 实验室:06303 实验日期:2015年12月25日 院(系) 数学与计算科学学院 学号 1300730114 姓名 陈俊鸿 成绩 课程名称 ACM实验 实验项目名称 实验九 动态规划 教师 评语 教师签名: 年 月 日 一 ,实验目的 将问题分解成为子问题进行递归求解,并且将中间结果保存以避免重复计算,来达到运行出结果的目的 二,实验内容 10.1例题:数字三角形 (ai2760) 问题描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路 径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求 出最佳路径上的数字之和。 注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。 输入数据 输入的第一行是一个整数 N (1 N = 100),给出三角形的行数。下面的N 行给出数字 三角形。数字三角形上的数的范围都在0 和100 之间。 输出要求 输出最大的和。 输入样例 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出样例 30 10.3 例题:最长上升子序列 问题描述 一个数的序列 bi,当b1 b2 ... bS 的时候,我们称这个序列是上升的。对于给定的一 个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 = i1 i2 ... iK = N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。 这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8). 你的任务,就是对于给定的序列,求出最长上升子序列的长度。 输入数据 输入的第一行是序列的长度 N (1 = N = 1000)。第二行给出序列中的N 个整数,这些 整数的取值范围都在0到10000。 输出要求 最长上升子序列的长度。 输入样例 7 1 7 3 5 9 4 8 输出样例 4 三,实验过程原始记录(数据,图表,计算等) 10.1例题:数字三角形 (ai2760) #include stdio.h #include memory.h #define MAX_NUM 100 int D[MAX_NUM + 10][MAX_NUM + 10]; int N; int aMaxSum[MAX_NUM + 10][MAX_NUM + 10]; main() { int i, j; printf(请输入行数:); scanf(%d, N); for( i = 1; i = N; i ++ ) for( j = 1; j = i; j ++ ) scanf(%d, D[i][j]); for( j = 1; j = N; j ++ ) aMaxSum[N][j] = D[N][j]; for( i = N ; i 1 ; i -- ) for( j = 1; j i ; j ++ ) { if( aMaxSum[i][j] aMaxSum[i][j+1] ) aMaxSum[i-1][j] = aMaxSum[i][j] + D[i-1][j]; else aMaxSum[i-1][j] = aMaxSum[i][j+1] + D[i-1][j]; } printf(和最大路径为%d\n, aMaxSum[1][1]); } 10.3 例题:最长上升子序列 #include stdio.h int main() { int i,N,b[1100]={0},MaxLen[1100]={0}; printf(请输入序列长度:); scanf(%d,N); for( i = 1;i = N;i ++ ) scanf(%d,b[i]); MaxLen[1] = 1; for(i = 2;i= N;i++)//每次求以第i个数为

文档评论(0)

1亿VIP精品文档

相关文档