給定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;
}