poj1179多边形——区间DP
题目:http://poj.org/problem?id=1179
区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值;
注意memset中写-1仅仅是-1,-2才是一个很小的负数;
最后找mxx时也要注意可能最大是负值,因此不能随便给mxx赋成0或-1之类。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,a[],mx[][],mn[][],ans[],t,INF=;
bool sid[][];
int main()
{
char dc;
scanf("%d ",&n);
memset(mx,-,sizeof mx);//-1仅是-1!
memset(mn,,sizeof mn);
for(int i=;i<=n;i++)
{
if(i==n)scanf("%c %d",&dc,&a[i]);
else scanf("%c %d ",&dc,&a[i]);
if(dc=='t')sid[i-][i]=;
else sid[i-][i]=;
a[i+n]=a[i];
sid[i-+n][i+n]=sid[i-][i];
mx[i][i]=a[i];mx[i+n][i+n]=a[i];
mn[i][i]=a[i];mn[i+n][i+n]=a[i];
}
for(int l=;l<=n;l++)
for(int i=;i<=n*-l;i++)//
{
int j=i+l-;
for(int k=i;k<j;k++)
{
if(sid[k][k+])
{
mx[i][j]=max(mx[i][j],mx[i][k]+mx[k+][j]);
mn[i][j]=min(mn[i][j],mn[i][k]+mn[k+][j]);
}
else
{
mx[i][j]=max(mx[i][j],mx[i][k]*mx[k+][j]);
mx[i][j]=max(mx[i][j],mn[i][k]*mn[k+][j]);
mx[i][j]=max(mx[i][j],mx[i][k]*mn[k+][j]);
mx[i][j]=max(mx[i][j],mn[i][k]*mx[k+][j]); mn[i][j]=min(mn[i][j],mx[i][k]*mx[k+][j]);
mn[i][j]=min(mn[i][j],mn[i][k]*mn[k+][j]);
mn[i][j]=min(mn[i][j],mx[i][k]*mn[k+][j]);
mn[i][j]=min(mn[i][j],mn[i][k]*mx[k+][j]);
}
}
}
int mxx=-INF;//!-1
// for(int i=1;i<=n;i++)
// {
// if(mx[i][i+n-1]>mxx)
// {
// memset(ans,0,sizeof ans);
// t=1;
// ans[t]=i;
// mxx=mx[i][i+n-1];
// }
// else if(mx[i][i+n-1]==mxx)ans[++t]=i;
// }
// printf("%d\n",mxx);
// for(int i=1;i<=t;i++)
// printf("%d ",ans[i]);
for(int i=;i<=n;i++)
mxx=max(mxx,mx[i][i+n-]);
printf("%d\n",mxx);
for(int i=;i<=n;i++)
if(mx[i][i+n-]==mxx)
printf("%d ",i);
return ;
}
poj1179多边形——区间DP的更多相关文章
- 多边形——————区间dp
原题链接:https://www.acwing.com/problem/content/285/ 题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分. 首先这不是一道板 ...
- Hzoi 2018.2.11多边形 区间DP
给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识. 一个多边形的图形表示 首次移动,允许将某条边删除: ...
- POJ1179 Polygon 区间DP
题目大意: 多边形游戏,有N个顶点的多边形,3 <= N <= 50 ,多边形有N条边,每个顶点中有一个数字(可正可负),每条边上或者是“+”号,或者是“*”号.边从1到N编号,首先选择一 ...
- poj1179 环形+区间dp
因为要用到模,所以左起点设置为0比较好 #include<iostream> #include<cstdio> #include<cstring> #define ...
- Vijos 1565 多边形 【区间DP】
描述 zgx给了你一个n边的多边形,这个多边形每个顶点赋予一个值,每条边都被标上运算符号+或*,对于这个多边形有一个游戏,游戏的步骤如下:(1)第一步,删掉一条边:(2)接下来n-1步,每步对剩下的边 ...
- 多边形游戏——区间dp
题目描述 多边形(Polygon)游戏是单人玩的游戏,开始的时候给定一个由N个顶点构成的多边形(图1所示的例子中,N=4),每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘 ...
- poj1179 区间dp(记忆化搜索写法)有巨坑!
http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...
- 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 ...
随机推荐
- 30天自制操作系统(三)进入32位模式并导入C语言
1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说 ...
- 玩转 eclipse:[2]代码重构
Java 程序重构的目标就是进行全系统程序代码变更, 使得工程更符合常用设计思想,它不但不会影响程序的行为 ,反而使程序的结构更为清晰合理. Eclipse 提供一系列非常高效并且有易于重构程序代码的 ...
- 在hibernate3中如何利用HQL语句查询出对象中的部分数据并且返回该对象?
例如现在有一个Customer对象 public class Customer{ private Integer cid; private String cname; private Integer ...
- 【demo练习四】:WPF用户控件案例
首先,新建vs中“用户控件(WPF)”,右键项目名 =>"添加"按钮 => 选择“新建项”. 然后选择“用户控件(WPF)” => 起名字 => 点击“添加 ...
- markdownPad2 绿色破解版安装
markdownpad2,默认为markdown传统风格,不能编辑分行的代码段,可以在设置里改为Github 风格,但需要付费激活,以下是绿色安装包,附激活方法 下载地址 https://pan.ba ...
- linux crontab 定时任务解析
-----------crontab定时任务---------------------- 检查crontab工具是否安装 crontab -l 检查crontab服务是否启动 service cron ...
- Executors几种常用的线程池性能比较
java编程中,经常会利用Executors的newXXXThreasPool生成各种线程池,今天写了一小段代码,简单测试了下三种常用的线程池: import com.google.common.ut ...
- Objective-C中NSString转NSNumber的方法
本文转载至 http://www.linuxidc.com/Linux/2013-02/78866.htm 在Objective-C中,以数字格式组成的字符串经常需要转换为NSNumber对象后再使用 ...
- mongodb 配置单实例与双实例
环境: centos6.5 192.168.16.70 配置单实例mongodb:[root@www soft]# tar xf mongodb-linux-x86_64-rhel62-3.2.7.t ...
- HDU - 1160 FatMouse's Speed 【DP】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意 给出一系列的 wi si 要找出一个最长的子序列 满足 wi 是按照升序排列的 si 是按 ...