Vijos 1565 多边形 【区间DP】
描述
zgx给了你一个n边的多边形,这个多边形每个顶点赋予一个值,每条边都被标上运算符号+或*,对于这个多边形有一个游戏,游戏的步骤如下:
(1)第一步,删掉一条边;
(2)接下来n-1步,每步对剩下的边中的一条进行操作,用一个新的顶点取代这条边。将这条被取代的边两端的顶点的整数值通过边上的运算得到的结果赋予新顶点。最后,所有的边被删除,只剩一个定点,这个定点的整数值就是游戏的最后得分。
你要做的就是算出给你的多边形能得到的最高分和最低分。
格式
输入格式
第一行,n;
第二行,n条边的运算符;
第三行,n个顶点的初始值;注:边和顶点都是按顺序输入,
第一个输入的边连接第一个输入的第二个输入的顶点。输出格式
最大值;
最小值。样例1
样例输入1
4
+++*
1 1 1 1
样例输出1
4
3
限制
各个测试点2s
提示
n<=50
解释样例:
1
+ +
1 1
* +
1
最大值:1+1+1+1=4或(1+1)*(1+1);
最小值:1*1+1+1=3;
题目链接:
题目大意:
N个数顺序排成一个圈,每两个数之间有一条边,+或*
题目要求删去一条边之后,任意顺序删掉一条边,并且把这条边两边的端点按照边上的符号运算,求最大最小值。
题目思路:
【区间DP】
可能是负数!!!
一开始居然傻逼的去做符号。。
首先破环,复制一遍数组到i+n。接着区间DP
max[i][j]和min[i][j]表示第i个数到第j个数所能获得的最大值和最小值。
然后枚举中间的断点。注意乘号的时候max=max*max,min*min。min=min*min,max*min。
//
//by coolxxx
/*
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//#include<stdbool.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
*/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-8)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#define N 104
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans; LL a[N];
char ch[N];
bool c[N];
LL maxx[N][N],minn[N][N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k,l;
int x,y,z;
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
while(~scanf("%d",&n))
{
for(i=;i<N;i++)
for(j=;j<N;j++)
maxx[i][j]=-MAX,minn[i][j]=MAX; scanf("%s",ch+);
for(i=;i<=n;i++)
{
if(ch[i]=='*')c[i+n]=c[i]=;
else c[i+n]=c[i]=;
}
for(i=;i<=n;i++)
{
scanf("%lld",&a[i]);
a[n+i]=a[i];
maxx[i][i]=maxx[i+n][i+n]=minn[i][i]=minn[i+n][i+n]=a[i];
}
for(l=;l<n;l++)
{
for(i=;i+l<=n+n;i++)
{
j=i+l;
for(k=i;k<j;k++)
{
if(c[k])
{
maxx[i][j]=max(maxx[i][j],maxx[i][k]*maxx[k+][j]);
maxx[i][j]=max(maxx[i][j],minn[i][k]*minn[k+][j]); minn[i][j]=min(minn[i][j],minn[i][k]*minn[k+][j]);
minn[i][j]=min(minn[i][j],maxx[i][k]*minn[k+][j]);
minn[i][j]=min(minn[i][j],minn[i][k]*maxx[k+][j]);
}
else
{
maxx[i][j]=max(maxx[i][j],maxx[i][k]+maxx[k+][j]);
minn[i][j]=min(minn[i][j],minn[i][k]+minn[k+][j]);
}
}
}
}
LL Min=MAX,Max=-MAX;
for(i=;i<=n;i++)
{
Min=min(Min,minn[i][i+n-]);
Max=max(Max,maxx[i][i+n-]);
}
printf("%lld\n%lld\n",Max,Min);
puts("");
}
return ;
}
/*
// //
*/
Vijos 1565 多边形 【区间DP】的更多相关文章
- poj1179多边形——区间DP
题目:http://poj.org/problem?id=1179 区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值: 注意memset中写-1仅仅是-1,-2才是一个很小的负数: 最后 ...
- 多边形——————区间dp
原题链接:https://www.acwing.com/problem/content/285/ 题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分. 首先这不是一道板 ...
- Hzoi 2018.2.11多边形 区间DP
给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识. 一个多边形的图形表示 首次移动,允许将某条边删除: ...
- Vijos 1100 (区间DP)
题目链接: https://vijos.org/p/1100 题目大意:NOIP著名的加分二叉树.给出一棵树的中序遍历,加分规则左子树*右子树+根.空子树分数为1.问最大加分的树结构,输出树结构的先序 ...
- Vijos p1002 过河 离散化距离+区间DP
链接:https://vijos.org/p/1002 题意:一条长度为L(L <= 1e9)的桥上有N(1<= N <= 100)颗石头.桥的起点为0终点为L.一只青蛙从0开始跳, ...
- Vijos 1451 圆环取数 【区间DP】
背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主…… 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...
- 多边形游戏——区间dp
题目描述 多边形(Polygon)游戏是单人玩的游戏,开始的时候给定一个由N个顶点构成的多边形(图1所示的例子中,N=4),每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘 ...
- kuangbin 区间dp
A - Cake 题目大意:给你一个n个顶点(n<=100)的多边形和每两个点连边的消耗,让你求把这个多边形全部切成三角形所需要的最小消耗,如果这个多边形为凹多边形则输出无解. 思路:先求一个凸 ...
- BZOJ 1719--[Usaco2006 Jan] Roping the Field 麦田巨画(几何&区间dp)
1719: [Usaco2006 Jan] Roping the Field 麦田巨画 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 82 Solved ...
随机推荐
- BZOJ 3144 切糕 最小割
题意: 一个矩阵,每个格子分配一个数,不同的数字,代价不同,要求相邻格子数字差小等于d 求最小代价. 分析: 我猜肯定有人看题目就想到最小割了,然后一看题面理科否决了自己的这个想法…… 没错,就是最小 ...
- ZOJ - 3204 Connect them 最小生成树
Connect them ZOJ - 3204 You have n computers numbered from 1 to n and you want to connect them to ma ...
- Layui下拉选渲染
下拉选渲染有很多方式,这个比较简单,记录一下: HTML代码如下: <div class="layui-input-inline"> <input type=&q ...
- Linux部署Web项目小记
1.安装Tomcat 官网下载 解压缩:tar -zxvf apache-tomcat-8.0.32.tar.gz 配置server.xml 连接池: <Executor name=" ...
- ubuntu 14.04上源码编译安装php7
wget https://downloads.php.net/~ab/php-7.0.0alpha2.tar.bz2 //用winscp把下载好的文件上传到网站中 tar jxf php-7.0.0a ...
- UvaLive 4863 Balloons(贪心)
题意: 给定n个队伍, 然后A房间有a个气球, B房间有b个气球, 然后给出每个队伍所需要的气球数量和到A B房间的距离, 求把气球全部送到每个队伍的最短距离. 分析: 在气球充足的情况下, 那么我们 ...
- C51 动态数码管 个人笔记
8段led管构成一个数字. 开发板上共有8个数字. 每个数字有一个使能端(段选引脚) 每个数字的位选端(选择8段led管哪些亮,即构成什么图案)并联在一起 轮流点亮不同数字,速度很快,视觉暂留,从而形 ...
- Leetcode 147.对链表进行排序
对链表进行插入排序 对链表进行插入排序. 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它 ...
- Python模块:time、datetime、random、os、sys、optparse
time模块的方法: 时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. struct_time时间元组,共有九个元素组.如下图: time.localtime([secs]): ...
- 舒适的路线(codevs 1001)
题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤ ...