POJ1179 Polygon 【例题精讲】

题意:多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号
游戏第1步,将一条边删除
随后n-1步按以下方式操作
(1)选择一条边E以及由E连接着的2个顶点V1和V2
(2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点
最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值;
这道题很有意思,也比较有难度,是一个算式形式的动态规划,和区间dp还是有一定联系的,因为我们每次开始游戏时需要断开一条边,之后就变成了一条链,可以看做区间,这样,我们初步应该会想到f[l][r]来表示l到r合并后最大的价值。
!!但是,这样就会有一个非常谜的问题!最大值不仅是由最大值加和而来的,它还可能是由两个最小值乘来的(负负得正),这样题就没法做了,所以这个子问题不满足无后效性!只能另寻它法!虽然说这个子问题不合适,但是这离我们的正解也已经非常近了。
我们可以用f[l][r]表示l到r所能合成的最大值,然后f1[l][r]表示l到r能合成的最小值。为什么这就能满足无后效性呢,因为啊:
1.一个最大值无非就是由两个最大值相加,两个最大值相乘或者两个最小值相乘而得来的!
2.一个最小值无非就是由两个最小值相加,或两个最小值相乘,或前一个最小值和后一个最大值相乘,或后一个最小值和前一个最大值相乘而得来的!
所以,我们就能够依据上述关系写出状态转移方程,这里就不给出了;
这样呢,我们就能够用区间dp的套路安排循环!但是有一个巨大的问题,我们需要枚举首先断掉那条边!这样下来会很麻烦,怎么办呢。在处理动态规划的环形问题时,我们可以先把这个环断掉,从任意位置断掉,然后长度复制一条一模一样的链连接在其后,这样我们就可以通过区间的移动来达成首先断一条边的操作;因为区间每次向右移动一位,都代表着把原来断的那条边接上,在把现有的最左边这条边断掉!这样就能达成一个。枚举先断哪条边的作用!
于是这道题完美解决,下面看代码!
 1 //怕你飞远去
 2 //怕你离我而去
 3 //更怕你永远停留在这里
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstdlib>
 7 #include<cstring>
 8 #include<string>
 9 #include<cmath>
10 #include<algorithm>
11 #include<queue>
12 using namespace std;
13 const int MAXN=125;
14 int f[MAXN][MAXN],f1[MAXN][MAXN],a[MAXN],n;//f[l][r]代表区间l到r所能合成的最大值,f1[l][r]表示区间l到r所能合成的最小值; 
15 char b[MAXN];
16 int main()
17 {
18     scanf("%d",&n);
19     memset(f,-0x3f,sizeof(f));//初始化;
20     memset(f1,0x3f,sizeof(f1));//初始化;
21     for(int i=1;i<=n;i++){
22         getchar();
23         scanf("%c%d",&b[i],&a[i]);
24         b[i+n]=b[i];a[i+n]=a[i];//断开,复制成一个两倍长度的链; 
25     }
26     for(int i=1;i<=2*n;i++){
27         f1[i][i]=f[i][i]=a[i];//初始化;
28     }//区间Dp 
29     for(int i=2;i<=n;i++){//阶段(区间的长度) 
30         for(int l=1;l<=n*2-i+1;l++){//状态(左端点) 
31             int r=l+i-1;//状态(右端点) 
32             for(int k=l;k<r;k++){//决策(嗯) 
33                 if(b[k+1]=='t'){
34                     f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]);//最大值由两个最大值相加而来 
35                     f1[l][r]=min(f1[l][r],f1[l][k]+f1[k+1][r]);//最小值由两个最小值相加而来 
36                 }
37                 else{
38                     f[l][r]=max(f[l][r],f[l][k]*f[k+1][r]);//最大值由两个最大值相乘而来 
39                     f[l][r]=max(f[l][r],f1[l][k]*f1[k+1][r]);//最大值由两个最小值相乘而来 
40                     f1[l][r]=min(f1[l][r],f1[l][k]*f1[k+1][r]);//最小值由两个最小值相乘而来 
41                     f1[l][r]=min(f1[l][r],f[l][k]*f1[k+1][r]);//最小值由前一个最大值和后一个最小值相乘而来 
42                     f1[l][r]=min(f1[l][r],f1[l][k]*f[k+1][r]);//最小值由前一个最小值和后一个最大值相乘而来; 
43                 }
44             }
45         }
46     }
47     int maxx=-0x7fffffff;
48     for(int i=1;i<=n;i++){
49         maxx=max(maxx,f[i][i+n-1]);
50     }
51     printf("%d",maxx);
52     puts("");
53     for(int i=1;i<=n;i++){
54         if(f[i][n-1+i]==maxx){//枚举,寻找第一步最优策略,有几个输出几个! 
55             printf("%d ",i);
56         }
57     }
58     puts("");
59     return 0;
60 }
View Code

 

转载于:https://www.cnblogs.com/Alan-Luo/articles/8723289.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学模拟电路的神器everycircuit

之前转的几篇文章&#xff0c;大家对里面的软件非常感兴趣&#xff0c;所以就给你们找来了&#xff0c;这是一个仿真软件。▌官网https://everycircuit.com/▌视频介绍&#xff0c;视频是老外的比如&#xff0c;你想仿真一个555定时器▌手机上也可以用&#xff0c;可以在我刚才…

我也想再上个学

关注我的同学应该知道&#xff0c;我不止在一次告诉大家读书是可以让大家能有更多的机会的&#xff0c;有时候自己也想什么时候再深造一下&#xff0c;等楠哥不那么需要我了&#xff0c;我也不用那么努力赚钱了&#xff0c;再去读读书&#xff0c;在学校里面打打篮球&#xff0…

使用GenerateDriverDiskISO无需软驱安装WINDOWS操作系统

转自&#xff1a;[url]http://bbs.wuyou.com/viewthread.php?tid121630&extra&page1[/url]附件中有详细文章内容及GenerateDriverDiskISO.RAR下载作者: lookskyoo 时间: 2008-3-5 11:19 标题: &#xff3b;chenhall找到最好的解决方案&#xff3d;自认为最好的…

ESP32搞的NES游戏掌机

本文转自立创开源硬件平台作者&#xff1a;micespring原文链接&#xff1a;https://oshwhub.com/micespring/esp32-nesemu▌简介一个基于ESP32制作的开源游戏掌机&#xff0c;可以运行标准的NES&#xff08;日版为FC&#xff09;游戏&#xff0c;支持单声道音频。让你随时回味儿…

Matplotlib从文件绘图时Y轴坐标不正确

问题描述&#xff1a; 从文件中读取X坐标和Y坐标&#xff0c;绘制折线图&#xff0c;代码和结果如下&#xff1a; import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib import stylestyle.use(dark_background)fig plt.figure()graph_…

全球最囧的爱情测试.....

据说这是全球最准的爱情测试&#xff1a;http://love.xf001.com/?uid224632 。。。。。。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。…

回答嵌入式初学者的一些问题

如图&#xff0c;最近类似的提问很多&#xff0c;上周末&#xff0c;刚打球回来&#xff0c;跟一起刚工作的同学聊了一个晚上。要知道&#xff0c;一个晚上的时间我可以做很多事情&#xff0c;可以玩好多局王者荣耀&#xff0c;可以看很多论坛的资料。但是我愿意花费时间在他身…

什么是RAC定位?

笔者因为工作原因&#xff0c;接触到一种叫做RAC的定位产品&#xff0c;该定位产品不同于一般的定位模组&#xff0c;它产品外表看起来很像一个GPS定位天线&#xff0c;通过一个4芯线缆&#xff08;供电串口通信&#xff09;直接和其它MCU/CPU 相连接&#xff0c;输出定位信息。…

15个有趣的555电路,没事可以自己做一做

NE555几乎是一个非常常见的一个芯片&#xff0c;在很多的电器里都能看到它的身影&#xff0c;本文为大家总结了一些有趣的NE555电路。013*3*3光立方02激光射线03金属探测器04音乐盒05电子转盘06舵机测试器07反应计时器08高压发生器09触摸开关10交通信号灯11电视信号干扰器12自行…

使用ABAP和JavaScript代码生成PDF文件的几种方式

ABAP 方法1&#xff1a;使用ABAP Adobe Lifecycle Enterprise Service 详细步骤参考我的博客Convert word document into PDF via Adobe Livecycle Enterprise service 方法2&#xff1a;使用ABAP Webdynpro里的InteravtiveForm控件 Adobe Form Template 详细步骤参考我的博客…

Configuration Manager 纯模式所需的 PKI 证书的分步部署示例

Configuration Manager 纯模式所需的 PKI 证书的分步部署示例&#xff1a;Windows Server 2008 证书颁发机构此分步示例部署使用 Windows Server 2008 证书颁发机构 (CA)&#xff0c;提供一些过程以指导您完成创建和部署 Configuration Manager 2007 在纯模式下操作所需的公钥基…

周琦能和范志毅比高下?

在最新的直播中&#xff0c;徐静雨就专门谈到了周琦与范志毅的对比&#xff0c;他先是举例乒乓球界的张继科与篮球界的姚明对比&#xff0c;张继科在乒乓球界的成就要远高于姚明&#xff0c;但是姚明的影响力却是张继科无法比较的。而在篮球界与足球界的对比中&#xff0c;他明…

[原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件

C/C语言中&#xff0c;如何在main.cpp中调用另一个.c文件主要有5种思路&#xff1a; 1、在VS2012 IDE中&#xff0c;将被引用的.c文件后缀名全部修改为.h&#xff0c;然后通过IDE的解决方案资源管理器中鼠标右键单击“头文件”-"添加"-“现有项”&#xff0c;选中修改…

[零基础学JAVA]Java SE应用部分-35.JAVA类集之四

JAVA按以下重要顺序 面向对象 类集框架 JDBC 文件编程本季目标主要讲解以下的内容&#xff1a; Collection List Set Map Iterator ListIteator Enumeration for…each语句&#xff08;JDK 1.5的新特性&#xff09; Comparable接口 二叉树1、类集结构&#xff08…

可在单片机上运行的简易图形库

来源&#xff1a;电子森林&#xff0c;排版&#xff1a;晓宇微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09;发现一个网站 - http://www.technoblogy.com/&#xff0c;基本都是关于用ATtiny单片机做各种创意设计的&#xff0c;非常适合初学单…

欧拉回路 欧拉路径

欧拉路径&#xff08;瞎&#xff09;定义 : 如果有一条路径使得能够走完所有的边且每一条边经过有且只有一次&#xff0c;这样的路径叫做欧拉路径 欧拉回路定义 : 如果有从起点出发最后回到起点的一条路径使得能够走完所有的边且每条边经过有且只有一次&#xff0c;称其为欧拉回…

终于搞清楚开漏输出和推挽输出这个鬼东西

先说下推挽输出&#xff0c;简单的说&#xff0c;就是想输出高电平&#xff0c;就输出高电平&#xff0c;想输出低电平就输出低电平。推挽电路上面是NPN三极管&#xff0c;下面是PNP三极管&#xff0c;请注意输入端和输出端的波形。下面是输入波形当输入为正时&#xff0c;上面…

被称为“C#圣经”的权威著作!

媒体评论 “哇&#xff0c;这本书太棒了&#xff01;对.NET 3.5和CLR的阐释非常深入。它已经成为我的头号参考书。强烈推荐给所有.NET程序员。” ——Jeff Wilcox&#xff0c;微软.NET开发团队资深工程师 “Troelsen大师王者归来了&#xff01;C#程序员分为两类&#xff1a;读…

分享一篇很不错的CMake入门文章,值得收藏细读!

https://www.hahack.com/codes/cmake/▌什么是 CMake?你或许听过好几种 Make 工具&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MS nmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;Makepp&#xff0c;等等。这些 Make 工具遵循…

例用C# 变更文件夹时间

想变更文件夹的时间.以前做了一个软件.是变更文件的时间,应用了C# API.这次和上一次相同,用Form来通过外部对时间进行确认.确认后应用C#中,System.IO ->Directory->SetCreationTime 来对时间进行变更.以下是C#应用的例子.基本相同.但是,不要忘记小问题,下面的例子的命名空…