Acwing P283 多边形 题解
Analysis
总体来说是一个区间DP
此题首先是一个环,要你进行删边操作,剩下的在经过运算得到一个最大值
注意事项:
1.删去一条边,剩下的构成一条线,相当于求此的最大值,经典区间DP该有的样子;
2.现在大概想法有了,还有一个细节,就是当中会出现负数,负数*负数是可能超过当前的最大值的,所以我们不仅需要维护区间最大值,还有最小值,因为两个极小值相乘是可以超过最大值的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define maxn 50+10
#define INF 9223372036854775807
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
int n;
int sym[*maxn],num[*maxn];
int dp[maxn][*maxn][*maxn],mdp[maxn][*maxn][*maxn];
int ans;
inline int max_five(int a,int b,int c,int d,int e)
{
return max(max(max(a,b),max(c,d)),e);
}
inline int min_five(int a,int b,int c,int d,int e)
{
return min(min(min(a,b),min(c,d)),e);
}
inline void clear()
{
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
for(int k=;k<=;k++)
{
dp[i][j][k]=-INF;
mdp[i][j][k]=INF;
}
}
}
}
signed main()
{
// freopen("ploygon.in","r",stdin);
// freopen("ploygon.out","w",stdout);
clear();
n=read();
for(int i=;i<=*n;i++)
{
if(i%==)
{
char in;
cin>>in;
if(in=='t') sym[i/+]=;
else if(in=='x') sym[i/+]=;
}
else if(i%==) num[i/]=read();
}
for(int i=n+;i<=*n;i++)
{
sym[i]=sym[i-n];
num[i]=num[i-n];
}
for(int j=;j<=n;j++)
{
for(int i=;i<=*n;i++)
{
dp[j][i][i]=num[i];
mdp[j][i][i]=num[i];
}
}
for(int i=;i<=n;i++)
{
for(int len=;len<=n;len++)
{
for(int j=i;j<=i+n-;j++)
{
int k=j+len-;
if(k>=i+n) break;
for(int l=j;l<k;l++)
{
if(sym[l+]==)
{
dp[i][j][k]=max(dp[i][j][k],dp[i][j][l]+dp[i][l+][k]);
mdp[i][j][k]=min(mdp[i][j][k],mdp[i][j][l]+mdp[i][l+][k]);
}
else if(sym[l+]==)
{
dp[i][j][k]=max_five(dp[i][j][k],dp[i][j][l]*dp[i][l+][k],mdp[i][j][l]*dp[i][l+][k],dp[i][j][l]*mdp[i][l+][k],mdp[i][j][l]*mdp[i][l+][k]);
mdp[i][j][k]=min_five(dp[i][j][k],dp[i][j][l]*dp[i][l+][k],mdp[i][j][l]*dp[i][l+][k],dp[i][j][l]*mdp[i][l+][k],mdp[i][j][l]*mdp[i][l+][k]);
}
}
}
}
ans=max(ans,dp[i][i][i+n-]);
}
write(ans);
printf("\n");
for(int k=;k<=n;k++)
{
if(dp[k][k][k+n-]==ans)
{
write(k);
printf(" ");
}
}
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
Acwing P283 多边形 题解的更多相关文章
- Acwing P284 金字塔 题解
Analysis 一棵树的每颗子树都对应着这棵树 DFS 序的一个区间.本题的序列虽然不是 DFS 序列,但也有该性质.本题中,我们以区间长度作为阶段, F[ l , r ] 表示序列 s[ l ~ ...
- Acwing P277 饼干 题解
每日一题 day20 打卡 Analysis 线型动态规划 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考 ...
- AcWing P379 捉迷藏 题解
Analysis 这道题因为我们要给能到达的两个点都连上,又由于n<=200,所以我们可以用n³的传递闭包来建边,再用匈牙利算法来求二分图最大点独立集. #include<iostream ...
- AcWing 走廊泼水节 题解
这道题大致题意就是让一棵树任意两点有连边(也就是完全图),但是补完后最小生成树是一开始的那棵树,问最小加的边权之和是多少. 了解题意后,我们可以想到用Kruskal(废话),当每两个集合合并的时候,除 ...
- csp-s 考前刷题记录
洛谷 P2615 神奇的幻方 洛谷 P2678 跳石头 洛谷 P1226 [模板]快速幂||取余运算 洛谷 P2661 信息传递 LOJ P10147 石子合并 LOJ P10148 能量项链 LOJ ...
- 【HNOI2019】部分题简要题解
题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...
- AcWing 785.快速排序
AcWing 785.快速排序题解 题目描述 给定你一个长度为n的整数数列. 请你使用快速排序对这个数列按照从小到大进行排序. 并将排好序的数列按顺序输出. 输入格式 输入共两行,第一行包含整数 n. ...
- 【题解】AcWing 110. 防晒(普及题)
[题解]AcWing 110. 防晒(普及题) AcWing 110. 防晒 你没有用过的全新OJ 嘿嘿水水题. 题目就是一维坐标轴上给定多个线段,给定多个点,点在线段上造成贡献,点可以重复,问最大贡 ...
- 【题解】切割多边形 [SCOI2003] [P4529] [Bzoj1091]
[题解]切割多边形 [SCOI2003] [P4529] [Bzoj1091] 传送门:切割多边形 \(\text{[SCOI2003] [P4529]}\) \(\text{[Bzoj1091]}\ ...
随机推荐
- Word样式教程
目录 写在前面 样式可以解决什么问题? 本文适合于 快速入门 一切皆样式 样式与格式的关系 如何修改样式 建立新的样式 样式的匹配和更新 根据样式更新所选段落 根据所选段落更新样式 小结 进一步了解 ...
- Python字符串格式化方式之format
format方式是在Python3引入了一个新的字符串格式化的方法,并且随后支持了Python2.7.这个新的字符串格式化方法摆脱了%操作符并且使得字符串格式化的语法更规范了.现在时候通过调用字符串对 ...
- MY SQL 两种安装方式
MySQL基础知识-安装MySQL 前导: 昨天去参加了一个面试,公司不太大,是一家日资企业,在国内有几家分公司,面试官问到了MySQL的基本操作和性能优化,说了一大堆,倒是比较轻松的过了,但是面 ...
- 文件流CopyTo
- Ado.Net查询语句使用临时表做条件
using System; using System.Data; using System.Data.SqlClient; using System.Text; namespace WindowsFo ...
- win10 查看本机的激活秘钥
系统的注册表中,找到如下位置 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectio ...
- JSP页面嵌套c:forEach
做java web项目有时候会需要在页面使用嵌套<c:forEach>遍历一个List,但是嵌套很容易忽略一些东西导致出错 后台代码: List<Map<String, Obj ...
- Linux-排JOB定时任务
排job的3种方法,at方法只能执行一次,crontab可循环执行比较灵活,anacrontable可以检测job是否正常执行,没有执行就会重新执行比较智能一些,但是要执行的指令脚本要 放到相应的 ...
- shell脚本:Syntax error: Bad for loop variable错误解决方法(转)
Linux Mint中写了一个简单的shell脚本,利用for..do..done结构计算1+2+3......+100的值,结果执行"sh -n xxx.sh"检测语法时总是报错 ...
- [bluez] linux下蓝牙鼠标的延迟问题
引言 现在的便携设备,接口越来越少了.所以我们没有理由不用蓝牙鼠标.高大上也不贵. 蓝牙4.0之前,蓝牙设备的问题是特别费电.蓝牙4.0之后省电的要命,我的上一个鼠标Microsoft Designe ...