1. 程式人生 > >多邊形遊戲 /// 區間DP oj1903

多邊形遊戲 /// 區間DP oj1903

最小 int 分享圖片 urn IT nbsp min open input

題目大意:

...

Input

輸入的第一行是單獨一個整數n( 3 ≤ n ≤ 18 ),表示多邊形的頂點數(同時也是邊數)。

接下來第n行,每行包含一個運算符("+"或"*")和一個整數V[i]( -10 < V[i] < 10 ),分別表示第i條邊所對應的運算符和第i個頂點上的數值。

Output

輸出只有一個整數,表示最高得分W ( -231 < W < 231 )。

Sample Input

3
+ 2
* 3
+ 1

Sample Output

9

技術分享圖片
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define
ll long long using namespace std; char e[105]; ll d[105],dp0[105][105],dp1[105][105]; /// 存在負數的情況 乘法時負負得正 所有要同時維護最大值和最小值 int main() { int n; scanf("%d\n",&n); for(int i=0;i<n;i++) { cin>>e[(i+n-1)%n]>>d[i]; dp0[i][1]=dp1[i][1]=d[i]; } /// 默認刪除 選擇的起點的前一條邊 for
(int r=2;r<=n;r++) for(int i=0;i<n;i++) { dp0[i][r]=INF, dp1[i][r]=-INF; for(int k=1;k<r;k++) { ll a=dp0[i][k], b=dp0[(i+k)%n][r-k], c=dp1[i][k], d=dp1[(i+k)%n][r-k]; /// 註意由於是環形 這兩處必須取模 if
(e[(i+k-1)%n]==*) { ll tmp[4]={a*b,a*d,c*b,c*d}; sort(tmp,tmp+4); dp0[i][r]=min(dp0[i][r],tmp[0]), dp1[i][r]=max(dp1[i][r],tmp[3]); } else { dp0[i][r]=min(dp0[i][r],a+b); dp1[i][r]=max(dp1[i][r],c+d); } } } ll ans=0; for(int i=0;i<n;i++) ans=max(ans,dp1[i][n]); printf("%lld\n",ans); return 0; }
View Code

多邊形遊戲 /// 區間DP oj1903