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,一经查实,立即删除!

相关文章

WinDBG 技巧:如何生成Dump 文件(.dump 命令)

程序崩溃&#xff08;crash&#xff09;的时候&#xff0c; 为了以后能够调试分析问题&#xff0c; 可以使用WinDBG要把当时程序内存空间数据都保存下来&#xff0c;生成的文件称为dump 文件。 步骤&#xff1a;1&#xff09; 打开WinDBG并将之Attach 到crash的程序进程2&#…

学模拟电路的神器everycircuit

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

我也想再上个学

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

timeSetEvent、回调函数、CCriticalSection

timeSetEvent https://baike.baidu.com/item/timeSetEvent/6645204 回调函数 https://blog.csdn.net/bzhxuexi/article/details/11769151 https://blog.csdn.net/bzhxuexi/article/details/11767979 https://blog.csdn.net/bzhxuexi/article/details/19831667 CCriticalSecti…

使用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;自认为最好的…

TQ210 —— s5pv210 Linux内核结构

Linux内核结构 1、内核的子系统 &#xff08;1&#xff09; 系统调用接口SCI(System Call Interface)&#xff1a;SCI层为用户空间提供了一套标准的系统调用函数来访问Linux内核&#xff0c;搭起了用户空间到内核空间的桥梁。 &#xff08;2&#xff09; 进程管理PM(Process …

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_…

主网络程序函数

CList https://baike.baidu.com/item/CList GetCurrentDirectory 是一个系统参数&#xff0c;在一个缓冲区中装载当前目录&#xff0c;Long&#xff0c;装载到lpBuffer的字节数。如nBufferLength的长度不够&#xff0c;不足以容纳目录&#xff0c;则返回值是必要的缓冲区长度&a…

TQ210 —— 嵌入式Linux根文件系统的设计与实现

嵌入式Linux根文件系统的设计与实现 1、Linux文件系统基本概念 文件系统类型&#xff1a;FAT32、NTFS、EXT2、 EXT3、 JFFS2、 YAFFS2、 NFS Linux根文件系统目录结构&#xff1a; &#xff08;1&#xff09; /bin 目录 该目录下存放所有用户(包括系统管理员和一般用户)都…

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

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

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

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

adobe

elements 是基础版 sp是破解版 hd是原版转载于:https://www.cnblogs.com/BlueFire-py/p/8727123.html

托盘

托盘 NOTIFYICONDATA https://baike.baidu.com/item/NOTIFYICONDATA/6123487?fraladdin shell_notifyicon https://baike.baidu.com/item/Shell_NotifyIcon/4842094 LoadIcon https://baike.baidu.com/item/LoadIcon FromHandle https://baike.baidu.com/item/FromHandle/1106…

Dynamipsgui入门教程

声明:本文主要是为刚刚认识dynamips这个模拟器的朋友.我写这个东西也是因为这个模拟器比较有实用价值.希望大家用好这个模拟器.完成学习.有什么问题欢迎大家在本论坛发帖.不说废话了直接进入主题吧,看门见图:首先我按图中序号对每个区域进行介绍:①:此区域是选择交换机和路由器…

什么是RAC定位?

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

ubuntu常见问题

1 Ubuntu下几个重要的文件 (1)软件源&#xff1a;/etc/apt/sources.list (2)$PATH: /etc/environment (3)环境变量&#xff1a; /etc/profile (4)Grub&#xff1a; /boot/grub/grub.cfg (5)用户bash&#xff1a; /home/[用户]/.bashrc 2 Ubuntu下设置环境变量…

CTreeCtrl

tree CTreeCtrl https://docs.microsoft.com/zh-cn/cpp/mfc/using-ctreectrl?viewvs-2017 https://baike.baidu.com/item/CTreeCtrl/5024970?fraladdin

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

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

英语考研词汇

1.With my own ears I clearly heard theheart beat of the nuclear bomb. 我亲耳清楚地听到原子弹的心脏的跳动。 2. Next year the bearded bear will bear adear baby in the rear. 明年,长胡子的熊将在后方产一头可爱的小崽. 3. Early I searched through the earth fo…