【分治】计算概论(A) / 函数递归练习(1)多边形游戏
2014-09-26 21:34
309 查看
#include<cstdio> #include<algorithm> using namespace std; int n,ans,v[41],c[41],s[2]; int work(int L,int R)//分治 { if(L==R) return v[L]; int res=0; for(int i=L;i<R;i++) if(c[i]=='+') res=max(res,work(L,i)+work(i+1,R)); else if(c[i]=='*') res=max(res,work(L,i)*work(i+1,R)); return res; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)//把环展开成n条链 { scanf("%d%s",&v[i],s); v[n+i]=v[i]; c[i]=c[n+i]=s[0]; } for(int i=1;i<=n;i++) ans=max(ans,work(i,i+n-1)); printf("%d\n",ans); return 0; }
总时间限制: 1000ms
内存限制: 65536kB
描述 一个多边形,开始有n个顶点。每个顶点被赋予一个正整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 现在来玩一个游戏,该游戏共有n步: 第1步,选择一条边,将其删除 随后n-1步,每一步都按以下方式操作:(1)选择一条边E以及由E连接着的2个顶点v1和v2; (2)用一个新的顶点取代边E以及由E连接着的2个顶点v1和v2,将顶点v1和v2的整数值通过边E上的运算得到的结果值赋给新顶点。
最后,所有边都被删除,只剩一个顶点,游戏结束。游戏得分就是所剩顶点上的整数值。那么这个整数值最大为多少?输入第一行为多边形的顶点数n(n ≤ 20),其后有n行,每行为一个整数和一个字符,整数为顶点上的正整数值,字符为该顶点到下一个顶点间连边上的运算符“+”或“*”(最后一个字符为最后一个顶点到第一个顶点间连边上的运算符)。输出输出仅一个整数,即游戏所计算出的最大值。样例输入
4 4 * 5 + 5 + 3 +
样例输出
70
提示小规模问题可不必用动态规划方法编程求解,仅用递归就可以求解。 计算中不必考虑计算结果超出整数表达范围的问题,给出的数据能保证计算结果的有效性。 在给的例子中,计算过程为(3+4)*(5+5)=70。
ORZ szy
分治思想,首先把环展成n条链,在处理的时候递归分治处理。
相关文章推荐
- 【openjudge 计算概论(A)】[函数递归练习(3)]
- 【openjudge 计算概论(A)】[函数递归练习(1)]
- 【递归】【栈】先修课 计算概论(A)/函数递归练习(2)5:布尔表达式
- 【openjudge 计算概论(A)】[函数递归练习(4)]
- 【递归】先修课 计算概论(A) / 函数递归练习(3)2:分解因数
- 【openjudge 计算概论(A)】[函数递归练习(2)]
- 【openjudge 计算概论(A)】[ 函数与字符串练习(2)]
- 【openjudge 计算概论(A)】[函数与字符串练习(1)]
- openjudge 计算概论 函数与字符串练习(1)2:字符串排序
- 函数与递归练习
- 一个递归计算数学表达式的函数
- 【openjudge 计算概论(A)】[结构体与链表练习]
- 菜鸟之路【计算导论与C基础】练习1 计算概论第五周 B-04作业
- 算法练习4.Median of Two Sorted Arrays两个有序数组的中位数(递归、分治)
- openjudge 计算概论基础编程练习(控制成分)
- 洛谷-数的计算-过程函数与递归
- openjudge 计算概论-数组练习-距离排序
- openjudge 计算概论-数组练习-错误侦测
- Openjudge-计算概论(A)-取石子游戏
- 一个递归计算数学表达式的函数