POJ 1179 Polygon (区间DP, 进阶指南)

博客详细介绍了POJ 1179 Polygon问题的解决方法,重点在于区间DP的应用。问题涉及在一个环形结构中,通过选择运算符(加号或乘号)连接点,并逐步减少边,最终求得最大值的过程。关键点包括状态表示、状态转移及如何处理环形结构。
摘要由CSDN通过智能技术生成

算法竞赛进阶指南, 284 页, 区间DP
题目意思:
有 n个点,每点都有一个整数(正,负, 0都可能), 用 n 条边把 n个点连成一个环形, 每条边上
都有一个运算符(加号 或者 乘号)。现在任意删除一条边,剩下 n - 1 条边。加下来 进行 n - 1 步骤,每一步 ,玩家选择一条边,然后用该边两边的数值和边上的运算符运算,等到新的整数。然后替换原来的两个顶点和一条边。 依次操作,直到剩下最后一点。求这个数的最大值,还要输出,具体删除了哪些边能得到最大值(多个的话,按递增输出)

本题要点:
1、转态表示, f[L][R] 表示第 L个顶点到 第R个顶点合并为一个顶点后的最大值
g[L][R] 表示第 L个顶点到 第R个顶点合并为一个顶点后的最小值
2、转态转移:
因为两个区间的合并, 操作符可能是 加号 ‘+’ ,乘号 ‘’.
1) 如果操作符是 ‘+’
区间 [L, R]的最大值 = 左区间 [L, K] 的最大值 + 右区间 [K + 1, R] 的最大值 ;
区间 [L, R]的最小值 = 左区间 [L, K] 的最小值 + 右区间 [K + 1, R] 的最小值
2) 如果操作符是 '

minL 表示 左区间 [L, K] 的最小值,
maxL 表示 左区间 [L, K] 的最大值
minR 表示 右区间 [K + 1, R] 的最小值,
maxR 表示 右区间 [K + 1, R] 的最大值

区间 [L, R]的最大值 = max{minL * minR, minL * maxR, maxL * minR, maxL * maxR}
区间 [L, R]的最大值 = min{minL * minR, minL * maxR, maxL * minR, maxL * maxR}

注意K 的取值范围  L <= K < R

3、 注意, “破环成链” 的方法:
开两倍的区间来模拟 环形

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

const int MaxN = 110, INF = 0x3f3f3f3f;
char op[MaxN];
int ver[MaxN];
int n;
int f[MaxN][MaxN];	// f[L][R] 表示第 L个顶点到 第R个顶点合并为一个顶点后的最大值
int g[MaxN][MaxN];	// g[L][R] 表示第 L个顶点到 第R个顶点合并为一个顶点后的最小值
int remove_edge[MaxN];
int remove_cnt;

int sort_4(int a, int b, int c, int d, int flag)
{
   
	int num[4];
	num[0] = a, num[1] = b, num[2] = c, num[3] 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值