zoukankan      html  css  js  c++  java
  • 【分治】计算概论(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条链,在处理的时候递归分治处理。

  • 相关阅读:
    POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
    LCA 最近公共祖先 (模板)
    线段树,最大值查询位置
    带权并查集
    转负二进制
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/3995630.html
Copyright © 2011-2022 走看看