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]}\ ...
随机推荐
- Makefile 介绍
makefile:是告诉编译器(交叉工具链)如何去编译.链接一个工程的规则. 一.概述 什 么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为 ...
- vue使用基础
1. 首先下载node.js安装 下载地址:https://nodejs.org/en/download/ 2. 安装vue脚手架 在cmd命令里面输入 npm install -g @vue/cli ...
- 上传自己的 NuGet 包
参考:https://blog.csdn.net/gulijiang2008/article/details/41724927 STEP 1:在NuGet上注册并获取API Key STEP 2:下载 ...
- js 简单的滑动2
js 简单的滑动教程(二) 作者:Lellansin 转载请标明出处,谢谢 现在我们让滑动多一个功能,三张图.点击左边向左滑动,点右向右滑,碰到临界值的时候可以循环滑动 原理也很将简单,用posi ...
- python3.7 64位中安装pygame1.9.3
1.我是用pip命令来安装的,首先,打开cmd,输入pip,检查电脑中有没有安装这个插件(一般python2.7以上自带pip工具) 2.更新pip工具的命令:python -m pip instal ...
- NEST analyze与mapping
/// <summary> /// POST /_analyze?pretty=true /// POST /employee/_analyze /// </summary> ...
- NameError: name “ ” is not defined
NameError: name “ ” is not defined 问题一:name ‘name’ is not defined "name"两端是双下划线"_&quo ...
- VMware下载及安装(含破解码)永久使用
VMware(纽约证交所代码:VMW)在虚拟化和云计算基础架构领域处于全球领先地位,所提供的经客户验证的解决方案可通过降低复杂性以及更灵活.敏捷地交付服务来提高IT效率.VMware使企业可以采用能够 ...
- 基于django的生成二维码的接口
原理就是在视图层写一个将数据生成二维码的视图函数: def generate_qrcode(request, data): img = qrcode.make(data) buf = BytesIO( ...
- c# MatchCollection类