POJ 1179 IOI1998 Polygon
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 5472 | Accepted: 2334 |
Description

On the first move, one of the edges is removed. Subsequent moves involve the following steps:
�pick an edge E and the two vertices V1 and V2 that are linked by E; and
�replace them by a new vertex, labelled with the result of performing the operation indicated in E on the labels of V1 and V2.
The game ends when there are no more edges, and its score is the label of the single vertex remaining.
Consider the polygon of Figure 1. The player started by removing edge 3. After that, the player picked edge 1, then edge 4, and, finally, edge 2. The score is 0. 
Write a program that, given a polygon, computes the highest possible score and lists all the edges that, if removed on the first move, can lead to a game with that score.
Input
3 <= N <= 50
For any sequence of moves, vertex labels are in the range [-32768,32767].
Output
Sample Input
4
t -7 t 4 x 2 x 5
Sample Output
33
1 2
Source
#include <iostream>
#include <cstring>
#include <cstdio>
const int N = + ;
using namespace std ;
int n,a[N];
char ss[N];
long long f[N][N],g[N][N],ans; void Init()
{
scanf("%d",&n);
for(int i = ; i <= n ; ++i)
{
cin>>ss[i]>>a[i];
a[n+i]=a[i],ss[n+i]=ss[i];
}
} void Solve( )
{
for(int i = ; i <= (n<<) ; ++i) for(int j = ; j <= (n<<) ; ++j)f[i][j] = -0x3f3f3f3f ;
for(int i = ; i <= (n<<) ; ++i) for(int j = ; j <= (n<<) ; ++j)g[i][j] = 0x3f3f3f3f ;
for(int i = ; i <= (n<<) ; ++i)
{
if(ss[i+]=='t')
f[i][i+] = g[i][i+] = a[i] + a[i+];
else
f[i][i+] = g[i][i+] = a[i] * a[i+];
f[i][i] = g[i][i] = a[i];
}
long long ans = -0x3f3f3f3f ;
for(int i = (n<<);--i;)
for(int j = i + ; j <=(n<<);++j)
for(int k = i;k<j;++k)
if(ss[k+] == 't')
{
f[i][j] = max(f[i][j],f[i][k]+f[k+][j]);
g[i][j] = min(g[i][j],g[i][k]+g[k+][j]);
}
else
{
long long int a = f[i][k]*g[k+][j],b = f[i][k]*f[k+][j];
long long int c = g[i][k]*f[k+][j],d = g[i][k]*g[k+][j];
f[i][j] = max(f[i][j],max(max(a,b),max(c,d)));
g[i][j] = min(g[i][j],min(min(a,b),min(c,d)));
}
for(int i = ; i<= n ;++i)
ans = max(ans,f[i][i+n-]);
printf("%lld\n",ans);
for(int i=;i<=n;++i)
if(f[i][i+n-] == ans)
printf("%d ",i);
puts("");
} int main( )
{
// freopen("polygon.in","r",stdin);
// freopen("polygon.out","w",stdout);
Init();
Solve();
fclose(stdin);
fclose(stdout);
return ;
}
POJ 1179 IOI1998 Polygon的更多相关文章
- 【POJ 1179】Polygon
[原题链接]传送门 [题解思路] 1.第一感觉没有其他做法,想到动态规划,去环,区间dp 2.f[l,r]表示[l,r]内的最大值,考虑转移 3.最大值分加法和乘法,其中乘法不一定由两个要求合并的区间 ...
- DP中环形处理 +(POJ 1179 题解)
DP中环形处理 对于DP中存在环的情况,大致有两种处理的方法: 对于很多的区间DP来说,很常见的方法就是把原来的环从任意两点断开(注意并不是直接删掉这条边),在复制一条一模一样的链在这条链的后方,当做 ...
- IOI1998 Polygon [区间dp]
[IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...
- Mark一下, dp状态转移方程写对,可是写代码都错,poj 1651 poj 1179
dp题: 1.写状态转移方程; 2.考虑初始化边界,有意义的赋定值.还没计算的赋边界值: 3.怎么写代码自底向上计算最优值 今天做了几个基础dp,所有是dp方程写对可是初始化以及计算写错 先是poj ...
- [IOI1998]Polygon(区间dp)
[IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...
- poj 1179 Polygon
http://poj.org/problem?id=1179 Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- POJ 1179 - Polygon - [区间DP]
题目链接:http://poj.org/problem?id=1179 Time Limit: 1000MS Memory Limit: 10000K Description Polygon is a ...
- poj 1179 $Polygon$(断环成链)
Polygon \(solution:\) upd:还是多讲一下,这道题基本上可以说是一道思维题.一道结论题.一道考验你动态规划基本功是否扎实的题目.因为这道题的数据范围很小,思考一下总能想到断环成链 ...
- IOI 98 (POJ 1179)Polygon(区间DP)
很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...
随机推荐
- Python属性、方法和类管理系列之----元类
元类的介绍 请看位于下面网址的一篇文章,写的相当好. http://blog.jobbole.com/21351/ 实例补充 class Meta(type): def __new__(meta, c ...
- List<>过滤重复的简单方法
List<int> ss = new List<int>(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add ...
- ConfigParser读取记事本、notepad++修改后的配置文件会出现:ConfigParser.MissingSectionHeaderError
使用ConfigParser来读取配置文件,经常会发现经过记事本.notepad++修改后的配置文件读取时出现下面的问题: ConfigParser.MissingSectionHeaderError ...
- eclipse查看.project .class隐藏文件
fileter ->*.resource勾选:
- easyui源码翻译1.32--Droppable(放置)
前言 使用$.fn.droppable.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3.2 * *翻译:lbq --放置 拉伸 */ (fun ...
- [jobdu]把数组排成最小的数
这道题见过,就是把相加的结果作为比较来排序就行了.注意的是comp函数里面要用const引用.而且c++里的字符串直接操作(读入和相加)也很方便. #include <iostream> ...
- MMU、Icache、Dcache
http://blog.csdn.net/iodoo/article/details/8954014 i-cache(instruction cache)是指令高速缓冲存储器. Cache存储体:存放 ...
- 【HDOJ】1504 Disk Tree
文件可以重名.先按字典序将路径排序,再过滤掉公共前缀.其中的问题是'\'的ASCII比[A-Z0-9]大,将它替换为空格.否则字典序有问题. /* 1504 */ #include <iostr ...
- 结构体dfield_t
/* SQL data field struct */ typedef struct dfield_struct dfield_t; /** Structure for an SQL data fie ...
- [转] KMP算法详解
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的K ...