给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识。

一个多边形的图形表示 首次移动,允许将某条边删除; 接下来的每次顺序移动包括下面步骤:

1、选出一条边E,以及由E联接的顶点V1和V2;

2、用一个新的顶点,取代边E及其所联接的两个顶点V1和V2。新顶点要赋予新的值,这个值是对V1和V2,做由E所指定的运算,所得到的结果。

所有边都被删除后,只剩下一个顶点,游戏结束。游戏的得分就是该顶点的数值。

任务:编写一个程序,对于任意给定的多边形,计算可能的最高得分,并且列举出所有的可以导致最高得分的被首次移动的边。

**注意:可以枚举删掉的边,

分别dp出最优方案输出,容易出错是状态转移方程:枚举分隔点k,当p[k]==’*’时fmax[i,j]=max{fmax[i][k]*fmax[k+1][j],fmin[i][k]*fmin[k+1][j]};

因为最小值可能是负数相乘为正可能更大。复杂度为O(n^4)。可以省掉一次枚举删边的过程,

将环拆成两个链,然后dp到2*n,最后ans=max{f[i][i+n-1],1<=i<=n}。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[120][120],a[120],d[120][120];
char p[120][120];
int main()
{
int n,ans=-0xfffffff;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i-1][i];
p[i][i-1]=p[i-1][i];
cin>>a[i];
}
p[n][1]=p[1][n]=p[1][0];
for(int i=1;i<=n;i++)
{
p[i+n-1][i+n]=p[i-1][i];
p[i+n][i+n-1]=p[i+n-1][i+n];
a[i+n]=a[i];
}
memset(d,0x3f,sizeof(d));
memset(f,128,sizeof(f));
for(int i=1;i<=2*n;i++)f[i][i]=d[i][i]=a[i];
for(int l=1;l<=n;l++)
for(int i=1;i<=2*n-l+1;i++)
{
int j=i+l-1;
for(int k=i;k<j;k++)
{
if(p[k][k+1]=='t')
{
f[i][j]=max(f[i][k]+f[k+1][j],f[i][j]);
d[i][j]=min(d[i][k]+d[k+1][j],d[i][j]);
}
if(p[k][k+1]=='x')
{
f[i][j]=max(max(f[i][k]*f[k+1][j],
d[i][k]*d[k+1][j]),f[i][j]);
d[i][j]=min(min(f[i][k]*d[k+1][j],
d[i][k]*f[k+1][j]),min(f[i][k]*f[k+1][j],d[i][j]));
} }
}
// cout<<f[1][n]<<endl;
// for(int i=1;i<=2*n;i++)
// { for(int j=1;j<=2*n;j++)
//
// cout<<f[i][j]<<" ";
// cout<<endl;}
for(int i=1;i<=n;i++)
if(f[i][i+n-1]>ans)
ans=f[i][i+n-1];
cout<<ans<<endl;
for(int i=1;i<=n;i++)
if(f[i][i+n-1]==ans)
cout<<i<<" "; }

Hzoi 2018.2.11多边形 区间DP的更多相关文章

  1. 多边形——————区间dp

    原题链接:https://www.acwing.com/problem/content/285/ 题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分. 首先这不是一道板 ...

  2. poj1179多边形——区间DP

    题目:http://poj.org/problem?id=1179 区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值: 注意memset中写-1仅仅是-1,-2才是一个很小的负数: 最后 ...

  3. Vijos 1565 多边形 【区间DP】

    描述 zgx给了你一个n边的多边形,这个多边形每个顶点赋予一个值,每条边都被标上运算符号+或*,对于这个多边形有一个游戏,游戏的步骤如下:(1)第一步,删掉一条边:(2)接下来n-1步,每步对剩下的边 ...

  4. 多边形游戏——区间dp

    题目描述 多边形(Polygon)游戏是单人玩的游戏,开始的时候给定一个由N个顶点构成的多边形(图1所示的例子中,N=4),每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘 ...

  5. 【湖南师范大学2018年大学生程序设计竞赛新生赛 L】【HDOJ2476】【区间DP】

    https://www.nowcoder.com/acm/contest/127/L L 小小粉刷匠 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开 ...

  6. 2018.10.25 bzoj4350: 括号序列再战猪猪侠(区间dp)

    传送门 区间dp好题. 首先我们并不用把右括号拿进来一起dpdpdp,而是直接用左括号来dpdpdp. 然后定义状态fi,jf_{i,j}fi,j​表示区间[l,r][l,r][l,r]的合法方案数. ...

  7. 2018.10.23 hdu2476String painter(区间dp)

    传送门 一道挺妙的区间dp. 我们先用区间dp求出第一个串为空串时的最小代价. 然后再加入原本的字符更新答案就行了. 代码: #include<bits/stdc++.h> using n ...

  8. 2018.10.23 hdu4745Two Rabbits(区间dp)

    传送门 区间dp经典题目. 首先断环为链. 然后题目相当于就是在找最大的回文子序列. 注意两个位置重合的时候相当于范围是n,不重合时范围是n-1. 代码: #include<bits/stdc+ ...

  9. 2018.10.22 bzoj4380: [POI2015]Myjnie(区间dp)

    传送门 区间dp好题. f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]最小值为kkk时的最大贡献. 然后可以枚举端点转移. 当时口胡到这儿就不会了. ...

随机推荐

  1. linux给文件或文件夹加入apache权限

    系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,測试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现例如以下php警 ...

  2. wait()方法写在while循环中可以在线程接到通知后再一次判断条件

    wait()方法写在while循环中可以在线程接到通知后再一次判断条件 synchronized public String pop() { String returnValue = "&q ...

  3. HTML标签列表

    HTML參考手冊 按功能类别排列 New : HTML5 中的新标签. 标签 描写叙述 <!--...--> 定义凝视. <!DOCTYPE> 定义文档类型. <a> ...

  4. 超简洁代码实现CircleImageView

    效果图: 页面代码: public class CircleView extends ImageView { private Paint mPaint = new Paint(); public Ci ...

  5. App/Activity/Screen Orientation

    测试android屏幕方向的小Demo 1.首先我们在values下面新建文件arrays.xml(用来在下拉列表中显示) <?xml version="1.0" encod ...

  6. Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465439  Android系统Recovery工作原理之使用update.zip升级过程分 ...

  7. hdoj Radar Installation

    Problem Description Assume the coasting is an infinite straight line. Land is in one side of coastin ...

  8. leetcode矩阵与动态规划相关

    目录 54/59螺旋矩阵 62不同路径 64最小路径和 120三角形最小路径和 695岛屿的最大面积 547朋友圈 718最长重复数组 221最大正方形 121/122/123/714/188买卖股票 ...

  9. C# 导出word 表格代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  10. sqlserver导入数据到mysql的详细图解

    SQL Server 迁移数据到MySQL 一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于 ...