2018-3-13——多边形游戏

这里写图片描述

题解:

  • 首先,我们根据提示可以知道,这一道题用的方法肯定就是递归了。
  • 那么让我们往递归的方向想,我们这样想,一条边,可以连接的是两个点或者是两个整块的运算结果,那我们对结果进行查找,找出其中最大的一个即可
  • 代码:
#include<bits/stdc++.h>
using namespace std;
int f[101][101],ff[101];
int num[101],ans,aa;
char s[101];
int n;
int find1(int l,int r){
    int i,k1,k2;
    if(f[l][r]!=-1)return f[l][r];   //查找过便不再去查询
    else if(l==r)return num[l];   //如果连接点的是本身,那么久返回这个数本身
    else {
        for(i=0; i<(r+n-l)%n; i++){
            k1=find1(l,(l+i)%n);
            k2=find1((l+i+1)%n,r);
            if(s[(l+i)%n]=='*')k1*=k2;        //同样去查找
            else k1+=k2;
            if(f[l][r]==-1)
                f[l][r]=k1;
            else if(k1>f[l][r])f[l][r]=k1;
        }
        return f[l][r];
    }
}
int find(int l){
    int i,k1,k2;
    for(i=1; i<n; i++){
        k1=find1((l+1)%n,(l+i)%n);
        k2=find1((l+i+1)%n,l);                 //一条边连接两个点或运算而来的"点" 
        if(s[l]=='*')k1*=k2;
        else k1+=k2;
        if(ff[l]==-1)ff[l]=k1;
        else if(k1>ff[l]) ff[l]=k1;
    }
    return ff[l];
}
int main() {
    int i,j;
    ans=0;
    scanf("%d",&n);
    for(i=0; i<n; i++){
        scanf("%d %c",&num[i],&s[i]);
    }
    for(i=0; i<n; i++)
        for(j=0; j<n; j++) f[i][j]=-1;
    for(i=0; i<n; i++) ff[i]=-1;         //表示第i条边最后计算的最大值
    for(i=0; i<n; i++){
        aa=find(i);
        if(aa>ans)ans=aa;        //如果大于,就交换
    }
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ghost_pig/article/details/79543043