给定一个由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: 统计代码行数和SVN修改行数的命令

    Mac下同样有效. 1. 统计目录下所有js文件的代码行数. find . -name '*.js' | xargs wc -l 2. 统计SVN的修改行数. svn diff -rBeginRev: ...

  2. HDU 4519

    实现简单,但不得不说是一道好题. 当员工数少于医生数时,直接输出K,因为此时N个员工同时检查,必定是最少的时间了. 当员工数大于医生数时,可以把员工的项目看成一段一段的,每个医生对其进行切割,总能得到 ...

  3. 四大传值详解:属性传值,单例传值,代理传值,block传值

    一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...

  4. iOS学习(3)

    4. 这个写法会出什么问题: @property (copy) NSMutableArray *array; 两个问题:1.加入,删除,改动数组内的元素的时候,程序会由于找不到相应的方法而崩溃.由于 ...

  5. Java集合类汇总记录--guava篇

    BiMap HashBiMap<K,V> 实现了两份哈希表数据结构(本类独立实现).分别负责两个方向的映射. EnumBiMap<K,V> 两个EnumMap对象分别负责两个方 ...

  6. hdu1325 Is It A Tree?(二叉树的推断)

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. C# Socket 您的主机中的软件中止了一个已建立的连接 An established connection was aborted by the software in your host machine

    http://tieba.baidu.com/p/3223234493 问题: 服务端在接收客户端数据的时候,抛了个异常出来:System.Net.Sockets.SocketException: 您 ...

  8. [Apple开发者帐户帮助]二、管理你的团队(7)管理服务器帐户

    如果在配置机器人以在多个设备上运行应用程序时向团队添加服务器,允许Xcode Server为您管理签名,或者配置机器人以创建iOS App文件,则服务器可以访问您的资产并显示在您的开发人员帐户 您可以 ...

  9. selenium3 + python - cookie定位

    from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitimport time d ...

  10. Python简介和基础入门

    1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是一种开发语言,而且已经 ...