算法设计作业多边形游戏动态规划

    xiaoxiao2023-11-27  173

    给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针

    依次编号为1~N。下图给出了一个N=4个顶点的多边形。

     游戏规则 :(1) 首先,移走一条边。 (2) 然后进行下面的操作: 选中一条边E,该边有两个相邻的顶点,不妨称为V1和V2。对V1和V2顶点所标的整数按照E上所标运算符号(+或是×)进行运算,得到一个整数;用该整数标注一个新顶点,该顶点代替V1和V2 。 持续进行此操作,直到最后没有边存在,即只剩下一个顶点。该顶点的整数称为此次游戏的得分(Score)。

    思路:

    环状的用两倍的数组储存,删掉一条边后转换成去给一个式子加括号,怎么加使值最大。

    状态转移方程:dp[i][j]=max(dp[i][j],d(i,k)$d(k+1,j));

    $表示与k+1之间的运算符,i<=k<j.

     样例输入:5 3*5+6+-7*3+

    样例输出:78

    代码:

    #include<bits/stdc++.h> #define INF -9999999 using namespace std; const int maxn = 100; int num[maxn]; char s[maxn]; int dp[maxn][maxn]; int d(int i,int j){ if(dp[i][j]!=INF) return dp[i][j]; if(i==j) return dp[i][j]=num[i]; for(int k=i;k<j;k++){ if(s[k]=='*') dp[i][j]=max(dp[i][j],d(i,k)*d(k+1,j)); else dp[i][j]=max(dp[i][j],d(i,k)+d(k+1,j)); } return dp[i][j]; } int main() { int n; while(cin>>n&&n){ for(int i=0;i<n;i++){ cin>>num[i]; num[i+n]=num[i]; cin>>s[i]; s[i+n]=s[i]; } int ans=INF; fill(dp[0],dp[0]+maxn*maxn,INF); for(int i=0;i<n;i++){ ans=max(ans,d(i+1,i+n)); } cout<<ans<<endl; } return 0; }

     

    最新回复(0)