没有合适的资源?快使用搜索试试~ 我知道了~
18342075 米家龙 第二章1
需积分: 0 0 下载量 5 浏览量
2022-08-03
15:07:06
上传
评论
收藏 439KB PDF 举报
温馨提示
试读
16页
2. 实验目的 3.程序设计 4. 程序运行与测试 5. 实验总结与心得
资源详情
资源评论
资源推荐
- 1 -
中山大学数据科学与计算机学院本科生实验报告
课程名称:算法设计与分析 任课教师:张子臻
年级
2018
专业(方
向)
软件工程
学号
18342075
姓名
米家龙
电话
18566916535
Email
781131011@qq.com
开始日期
2020-05-26
完成日期
2020-05-26
1. 实验题目:soj 1176 Two Ends
2. 实验目的
* 熟悉并掌握动态规划的算法
3.程序设计
思路:
使用递归实现;当数组中只剩下两个元素的时候,递归停止,否则继续;数
组一次减少两个元素,分别计算两次,第一次计算先手选取数组的头,后手贪
心,对剩下的数组进行递归;第二次则是先手选取数组的尾,后手贪心,对剩
下的数组进行递归
相关函数如下图:
int twoEnd(int begin, int end, int arr[])
{
// 终止递归
- 2 -
if (begin == end - 1)
return arr[begin] > arr[end] ? arr[begin] - arr[end] : arr[end] - arr[begin];
// 先手选前
bool nextChooseFront = arr[begin + 1] >= arr[end];
int frontChoose = arr[begin] - arr[nextChooseFront ? begin + 1 : end] + twoEnd(n
extChooseFront ? begin + 2 : begin + 1, nextChooseFront ? end : end - 1, arr);
// 先手选后
nextChooseFront = arr[begin] >= arr[end - 1];
int endChoose = arr[end] - arr[nextChooseFront ? begin : end - 1] + twoEnd(nextC
hooseFront ? begin + 1 : begin, nextChooseFront ? end - 1 : end - 2, arr);
return frontChoose > endChoose ? frontChoose : endChoose;
}
在使用样例测试的过程中,能够得到正确的答案,但是在 OJ 进行提交的时
候,会出现超时的 TLE 错误,发现有些部分会计算多次,最终导致时间消耗
过大,因此尝试使用一个二维数组来储存对应的结果,另一个二维数组来储存
上一个二维数组对应的位置是否储存有对应的结果,并在每个数组的输入之前
进行重置。
对于上述的两个二维数组,使用一个自己定义类来将 bool 和 int 变量放在一
起,类定义如下:
class unit
{
private:
int res;
bool hasCal;
public:
unit()
{
this->res = 0;
this->hasCal = false;
}
unit(int res, bool hasCal)
{
this->res = res;
this->hasCal = hasCal;
- 3 -
}
bool getCal()
{
return this->hasCal;
}
void setHasCal(bool newHasCal)
{
this->hasCal = newHasCal;
}
int getRes()
{
return this->res;
}
void setRes(int newRes)
{
this->res = newRes;
}
void reset()
{
this->res = 0;
this->hasCal = false;
}
};
优化 twoEnd() 函数后变为:
int twoEnd(int begin, int end, int arr[])
{
// 终止递归
if (begin == end - 1)
{
matrix[begin][end].setHasCal(true);
matrix[begin][end].setRes(arr[begin] > arr[end] ? arr[begin] - arr[end] : arr[
end] - arr[begin]);
return matrix[begin][end].getRes();
}
// 如果已经存在结果
if (matrix[begin][end].getCal())
return matrix[begin][end].getRes();
- 4 -
// 先手选前
bool nextChooseFront = arr[begin + 1] >= arr[end];
int frontChoose = arr[begin] - arr[nextChooseFront ? begin + 1 : end] + twoEnd(n
extChooseFront ? begin + 2 : begin + 1, nextChooseFront ? end : end - 1, arr);
// 先手选后
nextChooseFront = arr[begin] >= arr[end - 1];
int endChoose = arr[end] - arr[nextChooseFront ? begin : end - 1] + twoEnd(nextC
hooseFront ? begin + 1 : begin, nextChooseFront ? end - 1 : end - 2, arr);
matrix[begin][end].setHasCal(true);
matrix[begin][end].setRes(frontChoose > endChoose ? frontChoose : endChoose);
return matrix[begin][end].getRes();
}
4. 程序运行与测试
未使用储存进行优化:
剩余15页未读,继续阅读
王者丶君临天下
- 粉丝: 18
- 资源: 265
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0