多边形游戏 /// 区间DP oj1903
Posted _Jessie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多边形游戏 /// 区间DP oj1903相关的知识,希望对你有一定的参考价值。
题目大意:
...
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; }
以上是关于多边形游戏 /// 区间DP oj1903的主要内容,如果未能解决你的问题,请参考以下文章
Light oj 1044 - Palindrome Partitioning(区间dp)
Light OJ 1031 - Easy Game(区间dp)
台州 OJ 1704 Cheapest Palindrome 回文 区间DP