备忘录解决多边形游戏
问题描述:
多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。
游戏第1步,将一条边删除。
随后n-1步按以下方式操作:
(1)选择一条边E以及由E连接着的2个顶点V1和V2;
(2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点。
最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。
问题:对于给定的多边形,计算最高得分。
看了很多文章, 都没有用备忘录算法解决n后的问题,所以博主试着用备忘录基本思想撸了一个n后问题的备忘录版本。首先,简单说说什么是备忘录算法。备忘录方法是动态规划的变形。与动态规划算法一样,备忘录方法用表格保存已解决的子问题的答案,在下次需要解决此问题时,只要简单地查看该子问题的解答,而不必重新计算,从而减少算法的时间复杂度。与动态规划不同的是,备忘录方法的递归方式是自顶向下的,不同于动态规划的自底向上。
下面开始分析算法:
数据结构:
v[N+1] 存放顶点数值
op[N+1] 存放操作符
flag[N+1][N+1] 表示该段数据有没有写入,写入为1,否则为0
m[i][j] 表示该段的数据,i为起点,j为终点
place 限制返回范围
#include <iostream>
using namespace std;
#define N 100
int v[N + 1];
int m[N + 1][N + 1];
char flag[N + 1][N + 1];
char op[N + 1];
int p;
int n;
int maxf;
int place = 1;
int fun(int i, int j, int k)
{if (op[j] == '+')return i + k;else return i*k;
}int polyMax(int i, int j)
{if (i == j){m[i][j] = v[i];return v[i];}if (flag[i][j] == 1&&i >= place&&j >= place){return m[i][j];}int u = fun(polyMax(i, i), i, polyMax(i + 1, j));for (int k = i + 1; k < j; k++){int t = fun(polyMax(i, k), k, polyMax(k + 1, j));if (t>u)u = t; }m[i][j] = u;flag[i][j] = 1;return u;
}
void init()
{for (int i = 1; i <= 2 * n - 1; i++)for (int j = 1; j <= 2 * n - 1; j++){m[i][j] = 0;flag[i][j] = 0;}
}
int main()
{int temp;cout << "请输入多边形顶点数:" << endl;cin >> n;for (int i = 1; i <= n; i++){cout << "请输入多边形顶点" << i << "数值:" << endl;cin >> v[i];cout << "请输入多边形边" << i << "运算符:" << endl;cin >> op[i];}maxf = polyMax(1, n);p = 1;for (int a = 2; a <= n; a++){place++;v[n + a - 1] = v[a-1];v[a - 1] = 0;op[n + a - 1] = op[a - 1];temp = polyMax(a, n + a-1);if (temp > maxf){maxf = temp;p = a;}}cout <<"首次删掉第"<<p<<"条边,结果最大:"<< maxf << endl;system("pause");return 0;
}
代码具体分析:
因为多边形游戏起点是不定的,现假设第一次删的是第4条边。
对于上图,我们要求的是m[1][4]的值
不难理解:m[1][4]=max{m[1][1]op[1]m[2][4],m[1][2]op[2]m[3][4],m[1][3]op[3]m[4][4]}
而m[1][1]的值就是一个点,就是它本身的值1
m[2][4]=max{m[2][2]op[2]m[3][4],m[2][3]op[3]m[4][4]}
同理m[3][4],m[1][3]的值也可以求得。
我们可以用一个表格来表示:
可以发现上层的值可以通过下层的值得到。最后得到的结果24是第一条边删去的是op[4]
而根据问题我们需要每个边都要算一遍,这时候只需要把顶点的数据处理一下就可以了
可以用v[5]来表示v[1]的值,op[5]=op[1],然后从2~5开始再算一遍,这样就可以算出第一次删掉的边是op[1]的情况
n条边执行n次循环再筛选出其中的最大值,这就是问题的解。
执行效果如图:
备忘录解决多边形游戏相关推荐
- 萌新做点小玩意儿DAY-4 动态规划解决多边形游戏
还是先简单的介绍一下动态规划的算法思想,跟分治法的思想相似的是把一个比较大的问题分解成若干子问题,而分治法分解出来的子问题都是相同规模有相同的解决办法的,动态规划可以通过空间换时间来解决这些相同的问题 ...
- 动态规划-多边形游戏算法
动态规划-多边形游戏算法 一.多边形游戏简介 首先,多边形游戏是一个单人玩的游戏. 游戏初始时是由n(n>=3)个顶点构成的多边形,每个顶点被赋予一个整数值,每条边被赋予一个运算符"+ ...
- 运用贪心思想解决跳跃游戏
运用贪心思想解决跳跃游戏 文章目录 运用贪心思想解决跳跃游戏 Jump Game I 1.题目描述 2.分析 3.代码 Jump Game II 1.问题描述 2.分析 3.动规代码[超时] 4.贪心 ...
- 动态规划---多边形游戏
1.问题描述: 给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针 依次编号为1~N.下图给出了一个N=4个顶点的多边形. 游戏规则 :(1) 首先, ...
- 动态规划多边形游戏c语言,动态规划-多边形游戏问题
1.描述:有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值,每条边被赋予一个运算符"+"或"*".所有边依次用整数从1到n编号. 游戏第1步,将一条边删除 ...
- java实现多边形游戏问题_动态规划-多边形游戏
算法思想:动态规划 实际问题:多边形游戏 编写语言:Java 前言 多边形游戏问题是矩阵连乘的最优计算次序问题与凸多边形最优三角剖分问题的推广.我在解决凸多边形最优三角剖分问题时偶然间看到了这个结论, ...
- 多边形游戏-动态规划(Java)
问题说明 开始时一个由n个顶点构成的多边形.每个顶点被赋予一个整数值,每条边被赋予一个运算符"+"或" × ".所有边依次用整数从1到n编号.之后,将相邻两个顶 ...
- 猫和老鼠服务器维修有问题,猫和老鼠常见问题怎么解决_游戏技巧攻略_3DM手游...
在猫和老鼠手游中如果游戏中遇到一些问题应该怎么解决呢?游戏中会出现比较多的问题,不知道的小伙伴就看看小编整理的猫和老鼠常见问题解决办法介绍,感兴趣的小伙伴就一起来看看吧. 猫和老鼠手游常见问题解决方法 ...
- 动态规划--多边形游戏
1)问题描述 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值,每条边被赋予一个运算符+或*.所有边依次用整数从1到n编号,游戏第1步,将一条边删除. 随后n ...
最新文章
- 程序员:我受够了!不想再在小厂里干Java了!
- PHP 一个可以过滤非法脚本的函数
- python--内置函数
- Android的Handler,Looper源码剖析
- C++ lower_bound和upper_bound的区别
- C#通用权限管理-程序安全检查,这些你一定要考虑到位
- Hbase导入、导出数据到本地文件
- ret2dir:Rethinking Kernel Isolation(翻译)
- CICD详解(九)——gitlab简单使用
- 【转】commons-lang.jar包简介
- 非线性微分方程线性化
- img下方出现空隙的原因及解决办法
- 传统安防监控直播的四分屏的前端展示代码
- 宝健中国用产品缔造口碑,深受消费者信赖
- 网络语言上多个C是什么意思,今年流行的网络用语,个个都很有意思,你知道几个呢?...
- 如何将已有图片做成透明水印_如何用Photoshop在图片上添加透明水印?
- 【码农学编曲】关于宿主软件和插件的推荐
- 数据库作业:第七章: 数据库设计
- openFrameworks实现的简单坦克对战游戏-Tank War
- java jdk1.8.0_221 安装步骤