题意翻译

题目可能有些许修改,但大意一致

多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4。每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记。

第一步,删除其中一条边。随后每一步:

选择一条边连接的两个顶点V1和V2,用边上的运算符计算V1和V2得到的结果来替换这两个顶点。

游戏结束时,只有一个顶点,没有多余的边。

如图所示,玩家先移除编号为3的边。之后,玩家选择计算编号为1的边,然后计算编号为4的边,最后,计算编号为2的边。结果是0。

(翻译者友情提示:这里每条边的运算符旁边的数字为边的编号,不拿来计算)

编写一个程序,给定一个多边形,计算最高可能的分数。

输入格式

输入描述一个有n个顶点的多边形,它包含两行。第一行是数字n,为总边数。

第二行描述这个多边形,一共有2n个读入,每两个读入中第一个是字符,第二个是数字。

第一个字符为第一条边的计算符号(t代表相加,x代表相乘),第二个代表顶点上的数字。首尾相连。

3 < = n < = 50

对于任何一系列的操作,顶点数字都在[-32768,32767]的范围内。

输出格式

第一行,输出最高的分数。在第二行,它必须写出所有可能的被清除后的边仍能得到最高得分的列表,必须严格递增。

输入输出样例

输入样例#1:

4
t -7 t 4 x 2 x 5
输出样例#1:

33
1 2
------------------------------------------------------------------- 这道题就用来练一下区间dp了
首先这是一个环状多边形,将其拆成链状处理

  a[i+n]=a[i]; op[i+n]=op[i];//断链-> n*2

令 dp[l][r]表示以 l 为首项,以 r 为末项的链经过删边可以得到的最大值
然后,列出状态转移方程。这分为两部分:+和* 1.对于+,即op[i+1]=='t';

  dp[l][r]=max(dp[l][k]+dp[k+1][r],dp[l][r]);


2.对于*,情况稍微复杂:因为负负得正,所以我们还需要在转移时记录下
最小值[绝对值最大],用f[i][j]记录

  dp[l][r]=max( dp[l][r], max(dp[l][k]*dp[k+1][r],f[l][k]*f[k+1][r]) );

  f[l][r]=min( f[l][r], min(dp[l][k]*dp[k+1][r],f[l][k]*f[k+1][r]) );

还要对边界进行处理,
令a[i]为第i个的初始值,那么:

  dp[i][i]=f[i][i]=a[i];

同时,我们要先预处理长度为2的区间的答案

  if(op[i+1]=='t')

  dp[i][i+1]=f[i][i+1]=a[i]+a[i+1];

if(op[i+1]=='x')

dp[i][i+1]=f[i][i+1]=a[i]*a[i+1];

最后!!!输入的时候注意令人智熄的scanf!!!!!
(查错两小时
因为本题中字符和数字在一行中输入,所以
直接写scanf("%s%d",&op[i],&a[i]);会导致读到的是空格
所以要写成scanf("%d\n",&n); 和scanf("%s %d ",&op[i],&a[i]);
但是对于我来说,经常记不到的话,以后有同时输入字符和数字的时候,应该果断选择cin
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 120
#define INF 0x7f7f7f7f
#define ll long long
using namespace std;
ll f[N][N],dp[N][N];
int n,a[N];
char op[N];
ll ans=;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
// scanf("%c %d ",&op[i],&a[i]);
cin>>op[i]>>a[i];
a[i+n]=a[i]; op[i+n]=op[i];//断链-> n*2
}
for(int i=;i<=n*;i++)
for(int j=i;j<=n*;j++)
f[i][j]=INF,dp[i][j]=-INF;
for(int i=;i<=n*;i++)//预处len=2
{
if(op[i+]=='t')
dp[i][i+]=f[i][i+]=a[i]+a[i+];
if(op[i+]=='x')
dp[i][i+]=f[i][i+]=a[i]*a[i+];
dp[i][i]=f[i][i]=a[i];
}
for(int len=;len<=n;len++)
for(int l=;l<=n*-len+;l++)
{
int r=l+len-;
for(int k=l;k<r;k++)
{
if(op[k+]=='t')
{
dp[l][r]=max(dp[l][k]+dp[k+][r],dp[l][r]);
f[l][r]=min(f[l][k]+f[k+][r],f[l][r]);
}
else//乘法可能有负负得正 故记录最大和最小值
{
dp[l][r]=max( dp[l][r], max(dp[l][k]*dp[k+][r],f[l][k]*f[k+][r]) );
f[l][r]=min( f[l][r], min(dp[l][k]*dp[k+][r],f[l][k]*f[k+][r]) );
}
}
}
for(int i=;i<=n;i++)
//cout<<dp[i][i+n-1]<<" ";
ans=max(ans,dp[i][i+n-]);
printf("%lld\n",ans);
for(int i=;i<=n;i++)
if(ans==dp[i][i+n-])
printf("%d ",i);
return ;
}
/*
scanf("%d\n",&n);
scanf("%c %d ",&op[i],&a[i]);

scanf("%d",&n);
scanf("%c%d",&op[i],&a[i]);
*/

ovo


 




【IOI1998】Polygon 区间DP的更多相关文章

  1. IOI1998 Polygon [区间dp]

    [IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...

  2. [IOI1998] Polygon (区间dp,和石子合并很相似)

    题意: 给你一个多边形(可以看作n个顶点,n-1条边的图),每一条边上有一个符号(+号或者*号),这个多边形有n个顶点,每一个顶点有一个值 最初你可以把一条边删除掉,这个时候这就是一个n个顶点,n-2 ...

  3. POJ 1179 - Polygon - [区间DP]

    题目链接:http://poj.org/problem?id=1179 Time Limit: 1000MS Memory Limit: 10000K Description Polygon is a ...

  4. IOI 98 (POJ 1179)Polygon(区间DP)

    很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...

  5. 【POJ1179】Polygon 区间DP

    这道题是典型的环形石子归并模型,破环成链后时间复杂度为\(O(n^3)\) 不过,因为题目中所给的数字可能是负数,仅仅记录区间内合并之后的最大值并不满足动态规划的最优子结构性质.因此,还需要额外记录下 ...

  6. POJ1179 Polygon 区间DP

    题目大意: 多边形游戏,有N个顶点的多边形,3 <= N <= 50 ,多边形有N条边,每个顶点中有一个数字(可正可负),每条边上或者是“+”号,或者是“*”号.边从1到N编号,首先选择一 ...

  7. 【洛谷 P4342】[IOI1998]Polygon(DP)

    题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...

  8. 「IOI1998」「LuoguP4342」Polygon(区间dp

    P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...

  9. [IOI1998]Polygon(区间dp)

    [IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...

随机推荐

  1. 我们为什么要看《超实用的HTML代码段》

    不知道自己HTML水平如何,不知道HTML5如何进化?看这张图 如果一半以上的你都不会,必须看这本书,阿里一线工程师用代码和功能页面来告诉你每一个技术点. 都会一点,但不知道如何检验自己,看看本书提供 ...

  2. Linux系统常用命令大全

    一.系统信息操作(备注:红色标记为常用命令,以下类推,不再赘述) arch 显示机器的处理器架构(1) uname -m   显示机器的处理器架构(2) uname -r               ...

  3. vue2.X版本vue-cli生成项目后运行失败,报错信息为getaddrinfo ENOTFOUND localhost

    问题: 1.使用vue-cli生成项目 2.npm install 3.npm run dev,报错信息如下 解决方法: 经查,发现package.json中dev的脚本变成了"webpac ...

  4. 洛谷 P3019 [USACO11MAR]会见点Meeting Place

    题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 Bessie and Jonell are great friends. Since Farmer John ...

  5. ABC3D创客项目:风力小车

    随着互联网.开源硬件.电子信息等技术成熟应用,以及创新教育的大力普及,创新正成为青少年生活中最热门的话题之一:尤其新兴的3D打印技术将创意者.生产者.消费者合三为一,成为创新教育的又一大助力,每个学生 ...

  6. UVA 11134 FabledRooks 传说中的车 (问题分解)

    摘要:贪心,问题分解. 因为行列无关,所以这个二维问题可以分解成两个一维问题. 优先队列实现:类似区间点覆盖的问题,先按照左端点排序,相同然后在按右端点排序(灵活性小的优先选).最优的选法,当然是要使 ...

  7. POJ 4020 NEERC John's inversion 贪心+归并求逆序对

    题意:给你n张卡,每张卡上有蓝色和红色的两种数字,求一种排列使得对应颜色数字之间形成的逆序对总数最小 题解:贪心,先按蓝色排序,数字相同再按红色排,那么蓝色数字的逆序总数为0,考虑交换红色的数字消除逆 ...

  8. 10.1 plan

    1951    [Sdoi2010]古代猪文  Sdoi2010 Contest2   807 1928 1566    [NOI2009]管道取珠       806 1429 2756    [S ...

  9. Predicate和Consumer接口的使用

    //  Predicate   判断是否拥有资格,Consumer  改变输入的值 案例 public static MyTest2 getV(MyTest2 a, Predicate<MyTe ...

  10. 2018.3.16 win 关闭自动更新代码

    新建一个文本文件修改后缀名为 .bat 格式 net stop wuauserv sc config wuauserv start=disabled shutdown -r -t 1