博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P4342 Polygon 题解报告
阅读量:5056 次
发布时间:2019-06-12

本文共 1466 字,大约阅读时间需要 4 分钟。

【题目大意】

给一个n边形,每个顶点上有一个数值,每条边上有一个运算符号。每次删去一条边,同时将这条边连接的两端点的数值进行运算(运算符号记为这条边上的符号),求删去所有边后的最大值。

【思路分析】

首先断环为链,然后就跟是差不多的了,不过因为涉及到乘法并且有负数,所以DP过程中除了记录最大值还要记录最小值,详见代码。

【代码实现】

1 #include
2 #include
3 #define rg register 4 #define go(i,a,b) for(rg int i=a;i<=b;i++) 5 using namespace std; 6 const int N=102; 7 const int INF=1e9+9; 8 int n,m,a[N],f[N][N],g[N][N],ans=-INF; 9 char b[N];10 int main(){11 scanf("%d",&n);m=n<<1;12 go(i,1,n) {cin>>b[i]>>a[i];b[i+n]=b[i];a[i+n]=a[i];}13 go(i,1,m) go(j,1,m) f[i][j]=-INF,g[i][j]=INF;14 go(i,1,m) f[i][i]=g[i][i]=a[i];15 go(len,2,n)16 go(l,1,m-len+1)17 {18 int r=l+len-1;19 go(mid,l,r-1)20 {21 if(b[mid+1]=='t')22 {23 f[l][r]=max(f[l][r],f[l][mid]+f[mid+1][r]);24 g[l][r]=min(g[l][r],g[l][mid]+g[mid+1][r]);25 }26 else27 {28 f[l][r]=max(f[l][r],max(f[l][mid]*f[mid+1][r],max(f[l][mid]*g[mid+1][r],max(g[l][mid]*f[mid+1][r],g[l][mid]*g[mid+1][r]))));29 g[l][r]=min(g[l][r],min(f[l][mid]*f[mid+1][r],min(f[l][mid]*g[mid+1][r],min(g[l][mid]*f[mid+1][r],g[l][mid]*g[mid+1][r]))));30 }31 }32 }33 go(i,1,n) ans=max(ans,f[i][i+n-1]);34 printf("%d\n",ans);35 go(i,1,n) if(f[i][i+n-1]==ans) printf("%d ",i);36 return 0;37 }
代码戳这里

 

转载于:https://www.cnblogs.com/THWZF/p/10997896.html

你可能感兴趣的文章
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
spring的value,null标签
查看>>
jQuery html text val方法使用
查看>>
Eclipse寻找JVM的机制
查看>>
Day2:购物车
查看>>
Maven实战(六)--- dependencies与dependencyManagement的区别
查看>>
多边形的研究
查看>>
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>
ubuntu 安装mysql
查看>>
方法重写与方法重载
查看>>
C#生成PDF文档,读取TXT文件内容
查看>>
VS2008完全卸载工具
查看>>
Python入门小程序(一)
查看>>
Linux常用命令大全
查看>>
C#编程(三)
查看>>