【分治】计算概论(A) / 函数递归练习(1)多边形游戏

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,ans,v[41],c[41],s[2];
 5 int work(int L,int R)//分治
 6 {
 7     if(L==R) return v[L];
 8     int res=0;
 9     for(int i=L;i<R;i++)
10       if(c[i]==‘+‘) res=max(res,work(L,i)+work(i+1,R));
11       else if(c[i]==‘*‘) res=max(res,work(L,i)*work(i+1,R));
12     return res;
13 }
14 int main()
15 {
16     scanf("%d",&n);
17     for(int i=1;i<=n;i++)//把环展开成n条链
18       {
19           scanf("%d%s",&v[i],s);
20           v[n+i]=v[i];
21           c[i]=c[n+i]=s[0];
22       }
23     for(int i=1;i<=n;i++)
24       ans=max(ans,work(i,i+n-1));
25     printf("%d\n",ans);
26     return 0;
27 }
总时间限制: 
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条链,在处理的时候递归分治处理。

时间: 2024-12-14 18:18:42

【分治】计算概论(A) / 函数递归练习(1)多边形游戏的相关文章

【北大先修课】计算概论(A)题库全代码

题目很水就是全都是坑真是丧心病狂啊 把代码留下造福后来人QωQ 结构体与链表练习 生日相同2.0 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 200 using namespace std; struct st { int m,d; string name; bool operator&

iOS函数,函数递归

#import <Foundation/Foundation.h> #import "Function.h" int main(int argc, const char * argv[]) { //函数定义 /*返回值类型 函数名(参数1, 参数2, 参数3, 参数4) { 函数体; return 返回值; } */ //函数四种基本类型: //无参无返回值 //实参 到形参的过程是一个拷贝的过程 //函数的值,要哟过对应的数据类型进行接收 //c语言允许函数嵌套调用,不允

C和指针 第七章 函数递归与迭代

C语言通过运行时堆栈支持递归函数的实现,递归函数时直接或者间接调用自身的函数,经常有人拿斐波那契实现当做递归的实现,然后这样做效率并不高. n < 1;  Fib(1) =1 n = 2;  Fib(2) = 1 n > 2; Fib(n) = Fib(n - 1) + Fib(n - 2); 由于每个递归调用都会触发另外两个递归调用,而这两个调用还将继续触发下去,这样会有大量的冗余计算.例如:计算Fib(10)过程,Fib(3)被计算了21次: #include <stdio.h>

python编程:函数递归

函数递归其实没有特定的语法,可以理解为一种思想,我喜欢称他为递归思想 ------------------------------------------------------------------------------------------------------- 简单可以理解为: 在函数内部,可以调用其他函数,或者他可以调用自身,这个函数就是递归函数 例子(1): def func(n): n+=1 if n>=5: return 'end' return func(n) r=fu

十一、函数递归,算法二分法,三元表达式,列表字典生成式,匿名函数,内置函数

一.函数递归: 函数的递归:函数在调用阶段直接或间接的又调用自身 递归分为两个阶段 1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降 直到有一个最终的结束条件 2.递推:一次次往回推导的过程 3.递归函数在运行过程中一定要有出口,否则会无限循环下去 # 1.求4以内的和: def sum_numbers(num): if num == 1: return 1 return num + sum_numbers(num - 1) # 递归特点:函数内部自己调用

函数递归调用过程中的调用堆栈的情况

为了加深对函数递归调用过程中的理解,本Demo程序特意在VS2008 C#控制台程序实现了阶乘的计算功能,用于观察函数递归调用过程中的调用堆栈的情况. 源码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RecursiveTset { class Program { //阶乘的定义:n!=n*(n-1)!,特别的,1!=1:0!=1 //阶乘的实

逆战班!js基础关于函数递归

函数递归的特点: 1,函数自己调用自己 2,一般会有return 3,一般会有参数 注意: ****递归能做循环能做的一切,还能解决循环不容易解决的事 ****有时候会搞不懂递归是如何正确的实现功能的(因为有套路) 在一般的公司里面,明文禁止使用递归,但是懂得递归又是一个程序员必备的知识!!!! 至于为什么公司不允许使用递归,原因如下: 案例:计算1~100的和 使用普通循环语句: <script> function add(a) { var sum=0 for(var i = 1;i <

计算概论(A)/基础编程练习2(8题)/7:整数的个数

1 #include<stdio.h> 2 int main() { 3 int k,temp,n[3] = {0}; 4 5 // 输入k个正整数 6 scanf("%d",&k); 7 8 // 循环读入和进行算术 9 while(scanf("%d",&temp)!=EOF) { 10 switch(temp) { 11 case 1: 12 n[0]++; 13 break; 14 case 5: 15 n[1]++; 16 br

计算概论(A)/基础编程练习2(8题)/5:点和正方形的关系

1 #include<stdio.h> 2 #include<math.h> 3 int main() { 4 // 输入坐标 5 float x, y; 6 while(scanf("%f %f", &x, &y) != EOF) { 7 // 计算坐标点与原点的欧氏距离 8 float dist=sqrt(x*x+y*y); 9 10 /* 11 // 简单判断横坐标和纵坐标的截距abs(x).abs(y)和与原点距离dist 注意:abs(

函数递归

函数递归就是一个函数引用另一个函数.def func (n): n+=1 if n>=8: return "and" return func(n)n=func(1)print(n)def a(): print(123)def b (): r=a() return rdef c (): r=b() return rc()