Pku acm 1179 Polygon 动态规划题目解题报告(二十)

来源:互联网 发布:股票形态软件 编辑:程序博客网 时间:2024/05/16 15:58
http://acm.pku.edu.cn/JudgeOnline/problem?id=1179
多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。
游戏第1步,将一条边删除。
随后n-1步按以下方式操作:
(1)选择一条边E以及由E连接着的2个顶点V1和V2;
(2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点。
最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。
问题:对于给定的多边形,计算最高得分。分析:
         在所给多边形中,从顶点i(1≤i≤n)开始,长度为j(链中有j个顶点)的顺时针链p(i,j) 可表示为v[i],op[i+1],…,v[i+j-1]。
         如果这条链的最后一次合并运算在op[i+s]处发生(1≤s≤j-1),则可在op[i+s]处将链分割为2个子链p(i,s)和p(i+s,j-s)。
         m1是对子链p(i,s)的任意一种合并方式得到的值,而a和b分别是在所有可能的合并中得到的最小值和最大值。m2是p(i+s,j-s)的任意一种合并方式得到的值,而c和d分别是在所有可能的合并中得到的最小值和最大值。依此定义有a≤m1≤b,c≤m2≤d
(1)当op[i+s]='+'时,显然有a+c≤m≤b+d
(2)当op[i+s]='*'时,有min{ac,ad,bc,bd}≤m≤max{ac,ad,bc,bd}
         换句话说,主链的最大值和最小值可由子链的最大值和最小值得到。
 
这道题收获非常多:
1.已经定义了变量max,然后调用一个已经定义的函数max时报错:term does not evaluate to a function,原因是之前定义了一个int max;所以max(a,b)是把变量错误的当作函数使用
2.由于是一个环,所以下标要对n取模,这里还有一个技巧,例如当n=4时,4对4取模为0,不合要求,所以应该减一取模后加一
3.提交后 Time Limit Exceeded
发现代码中竟然有:
this_max = Max(getMaxResult(vertexth,i-1,true)*getMaxResult((vertexth+i-1)%n+1,length-i,true),          getMaxResult(vertexth,i-1,true)*getMaxResult((vertexth+i-1)%n+1,length-i,false),
getMaxResult(vertexth,i-1,false)*getMaxResult((vertexth+i-1)%n+1,length-i,true),
getMaxResult(vertexth,i-1,false)*getMaxResult((vertexth+i-1)%n+1,length-i,false));
这种语句,不Time Limit Exceeded 就奇怪了,接着改为:用变量保存结果,然后取最大值:
int firstTrue = getMaxResult(vertexth,i-1,true);
int secondTrue = getMaxResult((vertexth+i-1)%n+1,length-i,true);
int firstFalse = getMaxResult(vertexth,i-1,false);
int secondFalse = getMaxResult((vertexth+i-1)%n+1,length-i,false);
this_max = Max(firstTrue*secondTrue,firstTrue*secondFalse,firstFalse*secondTrue,firstFalse*secondFalse);
4.结果还是 Time Limit Exceeded 然后想到 可能多次求一个
getMaxResult,比如可能多次求一个getMaxResult(3,4,true),所以应该将结果保存起来,这正是动态规划的本质!刘汝佳《算法艺术和信息学竞赛》中115页讲到技艺化搜索,这个例子就非常典型。定义一个3维数组,然后初始化为一个很小的值,然后调用getMaxResult时先判断是不是已经计算过了(就是数组中是不是已经有值了),如果计算过就直接返回,否则在返回之前将值保存到数组中!
结果AC 帅,15ms
带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得
 
原创粉丝点击