POJ 1179 Polygon(动态规划:类似环形石子合并)

2024-05-28 19:08

本文主要是介绍POJ 1179 Polygon(动态规划:类似环形石子合并),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击打开链接


题意:给出一个多边形,切断某一条边,求出所有边合并后的最大值。

注意:最大值可能由最小值得来(负负得正)!所以要用两个dp数组维护。
第一次提交:WA,因为dMin[i][j] = getMin ( dMin[i][j], 那里直接复制前面的dMax[i][j] = getMax。
dMax没有改成dMin。。。。
第二次:PE,因为判断是否为第一个答案时用:i == 0来判断……

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 51;
const int INF = 0x3f3f3f3f;
int n;
int a[MAX_N * 2];
char e[MAX_N * 2];
int dMax[MAX_N * 2][MAX_N * 2];
int dMin[MAX_N * 2][MAX_N * 2];inline int getMax ( int a, int b, int c, int d , int e )
{return max ( max ( max ( a, b ), max ( c, d ) ) , e );
}inline int getMin ( int a, int b, int c, int d , int e )
{return min ( min ( min ( a, b ), min ( c, d ) ) , e );
}void solve()
{//initfor ( int i = 0; i <= 2 * n; i++ ){for ( int j = 0; j <= 2 * n; j++ ){if ( i == j ){dMax[i][i] = dMin[i][i] = a[i];}else{dMax[i][j] = -INF;dMin[i][j] = INF;}}}for ( int len = 1; len < n; len++ ){for ( int i = 0; i + len < 2 * n; i++ ){int j = i + len;for ( int k = i; k < j; k++ ){if ( e[k + 1] == 't' )	//plus{dMax[i][j] = max ( dMax[i][j], dMax[i][k] + dMax[k + 1][j] );dMin[i][j] = min ( dMin[i][j], dMin[i][k] + dMin[k + 1][j] );}else					//multi{//最大值可能由最小值得来(负负得正)dMax[i][j] = getMax ( dMax[i][j],dMax[i][k] * dMax[k + 1][j],dMin[i][k] * dMin[k + 1][j],dMax[i][k] * dMin[k + 1][j],dMin[i][k] * dMax[k + 1][j] );dMin[i][j] = getMin ( dMin[i][j],dMax[i][k] * dMax[k + 1][j],dMin[i][k] * dMin[k + 1][j],dMax[i][k] * dMin[k + 1][j],dMin[i][k] * dMax[k + 1][j] );}}}}int ans = -INF;for(int i = 0; i < n; i++){ans = max(ans, dMax[i][i+n-1]);}printf("%d\n", ans);bool first = true;for(int i = 0; i < n; i++){if(dMax[i][i+n-1] == ans){printf(first ? "%d" : " %d", i+1);first = false;}}printf("\n");
}int main()
{//freopen ( "in.txt", "r", stdin );scanf ( "%d\n", &n );for ( int i = 0; i < n; i++ ){scanf ( "%c %d", e + i, a + i );getchar();e[i + n] = e[i];a[i + n] = a[i];}solve();return 0;
}


这篇关于POJ 1179 Polygon(动态规划:类似环形石子合并)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011436

相关文章

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在