• 【分治】计算概论(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
    ",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条链,在处理的时候递归分治处理。

  • 相关阅读:
    推荐一些学习软件编程的网站
    Git总结笔记2-克隆远程仓库到本地
    Git总结笔记3-把本地仓库推送到github
    Git总结笔记1-搭建和使用30条简明笔记
    【师兄笔记】Java记录生活
    【师兄笔记】Java入门
    学习软件技术的那些事?
    Java编程基础
    献给还不知道怎么坚持的你
    GIT 检查、撤销修改简明教程
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/3995630.html
Copyright © 2020-2023  润新知