Hzoi 2018.2.11多边形 区间DP

给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识。

一个多边形的图形表示 首次移动,允许将某条边删除; 接下来的每次顺序移动包括下面步骤:

1、选出一条边E,以及由E联接的顶点V1和V2;

2、用一个新的顶点,取代边E及其所联接的两个顶点V1和V2。新顶点要赋予新的值,这个值是对V1和V2,做由E所指定的运算,所得到的结果。

所有边都被删除后,只剩下一个顶点,游戏结束。游戏的得分就是该顶点的数值。

任务:编写一个程序,对于任意给定的多边形,计算可能的最高得分,并且列举出所有的可以导致最高得分的被首次移动的边。

**注意:可以枚举删掉的边,

分别dp出最优方案输出,容易出错是状态转移方程:枚举分隔点k,当p[k]==’*’时fmax[i,j]=max{fmax[i][k]*fmax[k+1][j],fmin[i][k]*fmin[k+1][j]};

因为最小值可能是负数相乘为正可能更大。复杂度为O(n^4)。可以省掉一次枚举删边的过程,

将环拆成两个链,然后dp到2*n,最后ans=max{f[i][i+n-1],1<=i<=n}。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[120][120],a[120],d[120][120];
char p[120][120];
int main()
{
	int n,ans=-0xfffffff;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i-1][i];
		p[i][i-1]=p[i-1][i];
		cin>>a[i];
	}
	p[n][1]=p[1][n]=p[1][0];
	for(int i=1;i<=n;i++)
	{
		p[i+n-1][i+n]=p[i-1][i];
		p[i+n][i+n-1]=p[i+n-1][i+n];
		a[i+n]=a[i];
	}
	memset(d,0x3f,sizeof(d));
	memset(f,128,sizeof(f));
	for(int i=1;i<=2*n;i++)f[i][i]=d[i][i]=a[i];
	for(int l=1;l<=n;l++)
		for(int i=1;i<=2*n-l+1;i++)
		{
			int j=i+l-1;
			for(int k=i;k<j;k++)
			{
				if(p[k][k+1]==‘t‘)
				{
					f[i][j]=max(f[i][k]+f[k+1][j],f[i][j]);
					d[i][j]=min(d[i][k]+d[k+1][j],d[i][j]);
				}
				if(p[k][k+1]==‘x‘)
				{
					f[i][j]=max(max(f[i][k]*f[k+1][j],
					d[i][k]*d[k+1][j]),f[i][j]);
					d[i][j]=min(min(f[i][k]*d[k+1][j],
					d[i][k]*f[k+1][j]),min(f[i][k]*f[k+1][j],d[i][j]));
				}

			}
		}
//		cout<<f[1][n]<<endl;
//	for(int i=1;i<=2*n;i++)
//	{	for(int j=1;j<=2*n;j++)
//
//		cout<<f[i][j]<<" ";
//		cout<<endl;}
	for(int i=1;i<=n;i++)
	if(f[i][i+n-1]>ans)
		ans=f[i][i+n-1];
	cout<<ans<<endl;
	for(int i=1;i<=n;i++)
	if(f[i][i+n-1]==ans)
		cout<<i<<" ";

}

原文地址:https://www.cnblogs.com/starsing/p/11072852.html

时间: 2024-08-21 22:47:32

Hzoi 2018.2.11多边形 区间DP的相关文章

Vijos 1565 多边形 【区间DP】

描述 zgx给了你一个n边的多边形,这个多边形每个顶点赋予一个值,每条边都被标上运算符号+或*,对于这个多边形有一个游戏,游戏的步骤如下:(1)第一步,删掉一条边:(2)接下来n-1步,每步对剩下的边中的一条进行操作,用一个新的顶点取代这条边.将这条被取代的边两端的顶点的整数值通过边上的运算得到的结果赋予新顶点. 最后,所有的边被删除,只剩一个定点,这个定点的整数值就是游戏的最后得分. 你要做的就是算出给你的多边形能得到的最高分和最低分. 格式 输入格式 第一行,n;第二行,n条边的运算符:第三

QBXT 2018春季DP&amp;图论班 2018.5.3 --- 区间DP专题

本文题目等来自北京大学张浩威学长的PPT. 1.区间DP:解决有关两个或以上的区间的合并或删除的问题(最大/小次数/价值.方案总数.可行性等). 2.石子合并: 有n堆石子排成一排,第i堆石子的个数为ai.每次可以将相邻两堆合并成一堆.合并的代价为两堆石子的石子个数之和.设计方案要求代价之和最小. 状态:dp[l][r]表示只考虑区间l~r的石子,将它们合并的最小代价. 状态转移:dp[l][r]=min{dp[l][r],dp[l][k]+dp[k+1][r]+s[r]-s[l-1]} l~r

ZOJ 3537 Cake(凸包+区间DP)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形(凸包)则不能切,直接输出"I can't cut."切多边形时每次只能在顶点和顶点间切,每切一次的花费为 cost(i, j) = |xi + xj| * |yi + yj| % p.问把多边形切成最多个不相交三角形的最小代价是多少. 解题思路:先求出凸包,接着可以用区间DP解决,设dp

黑书例题 Fight Club 区间DP

题目可以在bnuoj.soj等OJ上找到. 题意: 不超过40个人站成一圈,只能和两边的人对战.给出任意两人对战的输赢,对于每一个人,输出是否可能是最后的胜者. 分析: 首先序列扩展成2倍,破环成链. dp[i][j]表示i和j能够相遇对打,那么dp[i][i+n]为真代表可以成为最后胜者. 枚举中间的k,若i和j都能和k相遇,且i和j至少一人能打赢k,那么i和j可以相遇. 复杂度o(n^3) 1 #include<cstdio> 2 #include<cstring> 3 usi

Luogu P2734 游戏 A Game 区间DP

P2734 游戏 A Game 题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束.以最终得分多者为胜. 题目描述 编一个执行最优策略的程序,最优策略就是使玩家在与最好的对手对弈时,能得到的在当前情况下最大的可能的总分的策略.你的程序要始终为第二位玩家执行最优策略. 输入输出格式 输入格式: 第一行: 正整数N, 表示序列中正整数的个数

lightoj1031_区间dp

题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 题目描述: 给出一个数列,两人轮流取数, 取完结束.每次可以取好多个数,但是只能从首或者尾为起点取连续的若干个.问最后两者取数和的绝对值最大为多少? 区间dp: 这道题我是在看了几份阶梯报告之后才想通的,现在想想很符合动态规划的要求 d(i, j)表示取数的人在数组i 到 j中能取的的最大值,然后中间枚举分割点, ans = max(ans, sum[k]-sum[i-1]-d

lightoj1025_区间dp

题目链接:http://lightoj.com/volume_showproblem.php?problem=1025 题目描述: 给出一个字符串,可以任意删除位置的字符,也可以删除任意多个.问能组成多少个回文串? 解题思路: 自从开始学dp,感觉自己智商一直处于离线状态.席八啊啊啊啊啊啊!今天随机到这个题目,看了好久竟然没有看出来是区间DP.知道是区间DP后立马感觉明白. 情景设定 dp[l][r] 表示 区间 [l, r] 内的回文串数目. 状态转移:dp[l][r] = dp[l][r-1

ZOJ 3537 Cake 求凸包 区间DP

题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价是多少. 思路:首先判断多边形是否是凸多边形,之后就是区间dp了. 求出凸包后,按逆时针来看. 设置dp[i][j]为从顶点i到顶点j所围成凸多边形的最优解. 枚举切点k (i < k < j) dp[i][j] = min(dp[i][k] + dp[k][j] + cost[i][k] + c

hdu 5115 Dire Wolf(区间dp)

Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not all, Dire Wolves appear to originate from Draenor. Dire wolves look like normal wolves, but these creatures are of nearly twice th