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://codeweblog.com/python-%e5%b8%b8%e7%94%a8%e6%a8%a1%e5%9d%97/ adodb:我们领导推荐的数据库连接组件bsddb3:B ...
- 简单的php表单
表单的三种传递机制: $_GET:不安全,传递的参数会显示在url中. $_POST:相对安全,隐形传递. $_REQUEST:宽松的,包含所有 GET.POST.COOKIE 和 FILE 的数据. ...
- asp.net中下载功能
//流方式下载 protected void ButtonButtonDownload_Click(object sender, EventArgs e) { //string fileName = ...
- SQLServer数据类型与C#类型对照表
这是我在开发多层体系结构时遇到的问题,由于VS.NET尚不支持各种数据类型的空值即null, 放入实体类中在各个层之间作为参数传递,所以经查询参考SQL Server 2000的联机丛书和.NET的M ...
- HDU4527+BFS
模拟BFS搜索 对于一个将要爆炸的点,可能同时由多个点引起. /* 模拟搜索过程 */ #include<stdio.h> #include<stdlib.h> #includ ...
- JavaScript 判断是否为undefined
if (typeof(reValue) == "undefined") { alert("undefined"); }
- SQLite入门与分析(六)---再谈SQLite的锁
写在前面:SQLite封锁机制的实现需要底层文件系统的支持,不管是Linux,还是Windows,都提供了文件锁的机制,而这为SQLite提供了强大的支持.本节就来谈谈SQLite使用到的文件锁——主 ...
- 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立
原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...
- bzoj3626
百度空间马上要下架的说,赶快把最后一点题解补完,然后搬家这是一道不错的题,首先注意询问是满足区间减法的,我们把他变成前缀和表示设我们询问[1,r]中的点和z的LCA深度和,假设我们确定一个根,不难发现 ...
- vxworks一个超级奇怪的错误(parse error before `char')
void tserver(int id) { if(debug){ useResource(,id);} char msgBuf[MAX_MSG_LEN]; if (msgQReceive(myMsg ...