题意

给定一个长度为n的序列,你可以进行若干次操作:

选择一个区间,删掉,并获得Val[Len]的得分,Len为这个区间的长度:

其中这个区间满足:

1.相邻两个数差的绝对值为1

2.每个数都大于相邻两个数的平均数

问最大得分。

解法

一眼过去,得到一个可能是O(n^4)的做法。

设f[i][j]表示删除掉[i,j]这个区间的最大得分。

然后发现只有这个转移不了,然后又多设了一个g[i][j][0/1],表示以a[i]开头的,以a[j]结尾的上升或下降的最大得分。

然后发现这个好像要多存一个个数,然后很倦生,然后就弃疗了。

赛后发现,其实标算跟我的做法差不多,多存一维个数可以用上升序列的性质直接算。

然后打着打着又发现了一个问题。

f[i][j]<-g[i][k]+g[k][j]的合并有点奇怪。

然后水过了之后再看标,恍然大悟。

靠这样转移就可以把两个g拼接起来了。

Code

#include<bits/stdc++.h>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std; const int maxn=407,Inf=0x7fffffff; int n,Val[maxn],a[maxn];
int Up[maxn][maxn],Dn[maxn][maxn]; void getUpDn(){
fo(i,1,n){
Up[i][i]=0;
fo(j,i+1,n){
if (Up[i][j-1]) Up[i][j]=Up[i][j-1];
else if (a[j]==a[j-1]+1) Up[i][j]=0;
else Up[i][j]=j;
}
}
fo(i,1,n){
Dn[i][i]=0;
fo(j,i+1,n){
if (Dn[i][j-1]) Dn[i][j]=Dn[i][j-1];
else if (a[j]==a[j-1]-1) Dn[i][j]=0;
else Dn[i][j]=j;
}
}
}
void Init(){
scanf("%d",&n);
fo(i,1,n) scanf("%d",&Val[i]);
fo(i,1,n) scanf("%d",&a[i]);
getUpDn();
} int Check(int l,int r,int L=0,int R=0){
if (L){
if (r-l+1==0) return Check(L,R);
else if (R-L+1==0) return Check(l,r);
else{
int x=Up[l][r];
if (x==0){
if (a[r]+1==a[L]) return Check(L,R);
else if (a[r]-1==a[L]) return (Dn[L][R]==0)*2;
else return 0;
}else{
if (Dn[x-1][r]==0 && a[r]-1==a[L]) return (Dn[L][R]==0)*2;
else return 0;
}
}
}else{
if (l==r) return 1;
else{
int x=Up[l][r];
if (x==0) return 1;
else return (Dn[x-1][r]==0)*2;
}
}
}
int f[maxn][maxn],g[maxn],h[maxn][maxn][2],Ans=0;
void getF(){
fo(Len,2,n)
fo(i,1,n){
int j=i+Len-1;
if (j>n) break;
fo(k,i,j-1){
if (a[k]+1==a[j]) h[i][j][0]=max(h[i][j][0],h[i][k][0]+f[k+1][j-1]);
if (a[k]-1==a[j]) h[i][j][1]=max(h[i][j][1],h[i][k][1]+f[k+1][j-1]);
}
fo(k,i,j-1){
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);
}
fo(k,i,j-1)
if (h[i][k][0]>-1e8 && h[k][j][1]>-1e8)
f[i][j]=max(f[i][j],h[i][k][0]+h[k][j][1]+Val[a[k]-a[i]+a[k]-a[j]+1]);
if (h[i][j][0]>-1e8) f[i][j]=max(f[i][j],h[i][j][0]+Val[a[j]-a[i]+1]);
if (h[i][j][1]>-1e8) f[i][j]=max(f[i][j],h[i][j][1]+Val[a[i]-a[j]+1]);
}
}
void getG(){
g[0]=0;
fo(i,1,n){
g[i]=g[i-1];
fo(j,0,i-1){
g[i]=max(g[i],g[j]+f[j+1][i]);
}
}
}
void Solve(){
fo(i,1,n) fo(j,1,n) f[i][j]=h[i][j][0]=h[i][j][1]=-1e9;
fo(i,1,n){
f[i][i-1]=0;
fo(j,i,n){
if (Check(i,j)) f[i][j]=Val[j-i+1];
else f[i][j]=-1e9;
if (j>i) h[i][j][0]=h[i][j][1]=-1e9;
else h[i][j][0]=h[i][j][1]=0;
}
}
getF();
getG();
Ans=g[n];
} void Print(){
printf("%d\n",Ans);
} int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
Init();
Solve();
Print();
return 0;
}

【JZOJ5179】【NOI2017模拟6.29】哈哈的更多相关文章

  1. 【JZOJ5180】【NOI2017模拟6.29】呵呵

    题目 分析 套上prufer序列, 对于一颗n个节点度数分别为\(d_1.d_2...d_n\)方案数为\(\dfrac{(n-2)!}{(d_1-1)!(d_2-1)!......(d_n-1)!} ...

  2. JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift

    5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  3. [jzoj NOIP2018模拟10.29]

    OI生涯的最高分,来了纪中这么多天,在经历了这么多场“NOIP难度”的模拟赛之后,终于看到了真正的NOIP 今天考场上效率很高,很快码完了全部的题目,留下了足够的时间对拍和...发呆.不得不说看着电脑 ...

  4. 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...

  5. 【模拟7.29】大佬(概率期望DP)

    首先根据数据范围,可以判断基本上是n^2的复杂度 通过分析我们发现每一次都可以从m个数中任意选,既然任意选,那么此时的概率的分母就是不变的,然而题中涉及的是某一段的最大值,所以我们按套路假设 f[i] ...

  6. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

  7. [JZOJ 5888] [NOIP2018模拟9.29] GCD生成树 解题报告 (最大生成树+公约数)

    题目链接: http://172.16.0.132/senior/#main/show/5888 题目: 题解: 思路是这样的:两个数的最大公约数一定不会比这两个数的任意一个数大.因此我们把权值相等的 ...

  8. [考试反思]0822NOIP模拟测试29:延续

    想保持优秀很困难 但是想持续垫底却很简单 但是你不想垫底的话持续垫底也很容易... 分AB卷,A卷共15人. skyh,tdcp,kx155,B哥145... 我:35,倒数第一. 板子专题,爆零快乐 ...

  9. 8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七

    T1 爬山 二分最高高度,$O(1)$判断是否可行. #include<iostream> #include<cstdio> #define ll long long usin ...

随机推荐

  1. 服务器断过一次电之后,mysql启动不了了

    公司内部服务器,周末会直接拉闸断电,之前也没问题,但这次回来发现mysql启动不了了. service mysqld start 提示: Starting MySQL.The server quit ...

  2. iOS 5 ARC 入门

    这篇文章还可以在这里找到 英语, 波兰语 Learn the ins and outs of ARC in iOS 5! 这是iOS 5 盛宴中的第12篇教程! 这篇教程是我们的新书 iOS 5 By ...

  3. csv文件格式

    弱渣今天第一次读Kaggle入门文章,知道train data,test data以及提供的result文件大都是以csv文件格式给出的. csv,全称 Comma-Separated Values, ...

  4. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3的解决方法

    最近在使用jquery easyui datagrid 对页面布局,发现有时在IE下会接收不到数据并报错: SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错 ...

  5. VS2010-MFC(菜单:菜单及CMenu类的使用)

    转自:http://www.jizhuomi.com/software/212.html 上一节讲的是VS2010的菜单资源,本节主要讲菜单及CMenu类的使用. CMenu类的主要成员函数 MFC为 ...

  6. day 55 Django基础五之django模型层(一)单表操作

      Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它 ...

  7. 01_MyBatis入门

    一.MyBaits介绍 1.MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且 ...

  8. [WPF自定义控件库]使用WindowChrome自定义RibbonWindow

    原文:[WPF自定义控件库]使用WindowChrome自定义RibbonWindow 1. 为什么要自定义RibbonWindow 自定义Window有可能是设计或功能上的要求,可以是非必要的,而自 ...

  9. spring:AOP面向切面编程02

    参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...

  10. Luogu P1131 [ZJOI2007]时态同步(dfs)

    P1131 [ZJOI2007]时态同步 题意 题目描述 小\(Q\)在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字\(1,2,3,\dots\).进行 ...