“unexpected, right?”大概可以翻译成“没想到吧!”

题意:给两个序列$w_{1\cdots n}$和$v_{1\cdots n}$,你可以多次删除$w$的子串$w_{l\cdots r}$并获得$v_{r-l+1}$分,被删除的$w_{l\cdots r}$要满足:对$\forall i\in[l,r-1]$有$|w_i-w_{i+1}|=1$且对$\forall i\in[l+1,r-1]$有$2w_i-w_{i-1}-w_{i+1}\geq0$,问最多获得多少分

说白了就是只能删(连续上升的/连续下降的/先连续上升后连续下降的)

设$f_{i,j}$表示删完$w_{i\cdots j}$的最大分数,$g_{i,j,0}$表示把$w_{i\cdots j}$删至连续上升的最大分数,$g_{i,j,1}$表示把$w_{i\cdots j}$删至连续下降的最大分数

$g_{i,j,0}=\max\left\{[w_{j-1}+1=w_j]g_{i,j-1,0},\mathop\max\limits_{k=i}^{j-2}\left\{[w_k+1=w_j](g_{i,k,0}+f_{k+1,j-1})\right\}\right\}$(可以直接在$w_{i\cdots j-1}$后加上$w_j$,也可以从中间选一个位置$k$,把$w_{k+1\cdots j-1}$删完,再接上$w_j$)

$g_{i,j,1}=\max\left\{[w_{j-1}-1=w_j]g_{i,j-1,1},\mathop\max\limits_{k=i}^{j-2}\left\{[w_k-1=w_j](g_{i,k,1}+f_{k+1,j-1})\right\}\right\}$(同理)

$f_{i,j}=\max\left\{\begin{matrix}[1\leq w_j-w_i+1\leq n](g_{i,j,0}+v_{w_j-w_i+1})\\ [1\leq w_i-w_j+1\leq n](g_{i,j,1}+v_{w_i-w_j+1})\\\mathop\max\limits_{k=i}^{j-1}\left\{f_{i,k}+f_{k+1,j}\right\}\\\mathop\max\limits_{k=i+1}^{j-1}\left\{[1\leq2w_k-w_i-w_j+1\leq n]g_{i,k,0}+g_{k,j,1}+v_{2w_k-w_i-w_j+1}\right\}\end{matrix}\right\}$(可以先删成连续上升或连续下降再直接删除,也可以先删$w_{i\cdots k}$再删$w_{k+1\cdots j}$,还可以先删成上升下降再整段删除)

最后再DP求出最大的$[i,j]$互不相交的$f_{i,j}$之和即可

#include<stdio.h>
const int inf=100000000;
int v[410],w[410],f[410][410],g[410][410][2],ans[410];
void max(int&a,int b){
	if(a<b)a=b;
}
int main(){
	int n,i,j,k;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",v+i);
	for(i=1;i<=n;i++)scanf("%d",w+i);
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++)f[i][j]=g[i][j][0]=g[i][j][1]=-inf;
	}
	for(i=n;i>0;i--){
		f[i][i]=v[1];
		g[i][i][0]=g[i][i][1]=0;
		for(j=i+1;j<=n;j++){
			for(k=i;k<j-1;k++){
				if(w[k]+1==w[j])max(g[i][j][0],g[i][k][0]+f[k+1][j-1]);
			}
			if(w[j-1]+1==w[j])max(g[i][j][0],g[i][j-1][0]);
		}
		for(j=i+1;j<=n;j++){
			for(k=i;k<j-1;k++){
				if(w[k]-1==w[j])max(g[i][j][1],g[i][k][1]+f[k+1][j-1]);
			}
			if(w[j-1]-1==w[j])max(g[i][j][1],g[i][j-1][1]);
		}
		for(j=i;j<=n;j++){
			if(w[j]-w[i]+1>0&&w[j]-w[i]+1<=n)max(f[i][j],g[i][j][0]+v[w[j]-w[i]+1]);
			if(w[i]-w[j]+1>0&&w[i]-w[j]+1<=n)max(f[i][j],g[i][j][1]+v[w[i]-w[j]+1]);
			for(k=i;k<j;k++)max(f[i][j],f[i][k]+f[k+1][j]);
			for(k=i+1;k<j;k++){
				if(2*w[k]-w[i]-w[j]+1>0&&2*w[k]-w[i]-w[j]+1<=n)max(f[i][j],g[i][k][0]+g[k][j][1]+v[2*w[k]-w[i]-w[j]+1]);
			}
		}
	}
	for(i=1;i<=n;i++){
		ans[i]=ans[i-1];
		for(j=0;j<i;j++)max(ans[i],ans[j]+f[j+1][i]);
	}
	printf("%d",ans[n]);
}

[CF392E]Deleting Substrings的更多相关文章

  1. Codeforces.392E.Deleting Substrings(区间DP)

    题目链接 \(Description\) \(Solution\) 合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i| ...

  2. CCPC2018-湖南全国邀请赛 G String Transformation

    G.String Transformation 题目描述 Bobo has a string S = s1 s2...sn consists of letter a , b and c . He ca ...

  3. [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  4. Leetcode: Unique Substrings in Wraparound String

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  5. 云硬盘error、error deleting、deleting状态(数据库基本操作小记)

    起因是发现云硬盘显示删光了,但还是创建不了新的云硬盘,在api节点上用cinder list可以看到已经没有硬盘了,但是创建硬盘时,还是会提示配额满了,这是因为数据库里的记录没有更新,对数据库的操作记 ...

  6. Failed deleting my ephemeral node

    2017-01-05 11:07:39,490 WARN zookeeper.RecoverableZooKeeper: Node /hyperbase1/rs/tw-node1217,60020,1 ...

  7. CSU-1632 Repeated Substrings (后缀数组)

    Description String analysis often arises in applications from biology and chemistry, such as the stu ...

  8. Refresh recovery area usage data after manually deleting files under recovery area

    Original source: http://www.dba-oracle.com/t_v$_flash_recovery_area.htm If you manually delete files ...

  9. CF451D Count Good Substrings (DP)

    Codeforces Round #258 (Div. 2) Count Good Substrings D. Count Good Substrings time limit per test 2 ...

随机推荐

  1. TCP ------ TCP创建服务器中出现的套接字

    在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求.这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回 ...

  2. 停止ambari上服务的顺序

    Before performing any upgrades or uninstalling software, stop all of the Hadoop services in the foll ...

  3. NET面试题 (四)

    1, 面向对象的思想主要包括什么? 封装.继承.多态. TLW: 封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部. 继承:子类拥有父类的所有数据和操作. 多态:一 ...

  4. classList详解,让你的js方便地操作DOM类

    在此之前,jQuery的hasClass.addClass.removeClass我们已经再熟悉不过了,然而我们并不会在每一个项目中都会去使用 jQuery或者Zepto,譬如在移动端的网页中,考虑到 ...

  5. c++对拍实现

    直接上代码吧. #include<bits/stdc++.h> using namespace std; int main(){ while(1){ system("./cute ...

  6. [POJ1082&POJ2348&POJ1067&POJ2505&POJ1960]简单博弈题总结

    鉴于时间紧张...虽然知道博弈是个大课题但是花一个上午时间已经极限了... 希望省选过后再回过头来好好总结一遍吧. 接下来为了看着顺眼一点...还是按照难度顺序吧   POJ1082 一道最简单的博弈 ...

  7. 单选按钮 JradioButton 和复选框 JcheckBox 的使用

    package first; import javax.swing.*; import java.awt.*; import java.awt.event.*; class BRTest extend ...

  8. bzoj 2005 NOI 2010 能量采集

    我们发现对于一个点(x,y),与(0,0)连线上的点数是gcd(x,y)-1 那么这个点的答案就是2*gcd(x,y)-1,那么最后的答案就是所有点 的gcd值*2-n*m,那么问题转化成了求每个点的 ...

  9. bzoj 2142 国家集训队试题 礼物

    问题转化成求C(N,M) mod P p为非素数,那么我们可以将P分解质因数, 也就是 π pi^ci的形式,因为这些pi^ci是互质的,所以我们可以用crt将他们合并 那么问题就转化成了快速求C(N ...

  10. Kuangbin带你飞 AC自动机

    模板: struct Ac_Automation { int ch[MAXNNODE][SIGMA_SIZE]; int val[MAXNNODE]; int fail[MAXNNODE],last[ ...