“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. 用JavaScript写一个类似PHP print_r的函数

    PHP print_r的函数很好用,可以用来打印数组.对象等的结构与数据,可惜JavaScript并没有原生提供类似的函数.不过我们可以试着自己来实现这个函数,下面提供一些方法与思路. 方法一 fun ...

  2. Asp.net MVC Combres的简单用法

    第一步:添加nuget包 [1]添加 nuget包后,会自动在 webconfig里面 添加配置文件(不用改) <section name="dotless" type=&q ...

  3. 关于 WizTools.org RESTClient的使用

    今天分享一个很好用的测试service的工具,很好用 提供两种方法使用这个东东. 第一种方法 通过cmd命令窗口. (1)cd C:\Users\li_weifeng\Desktop\c4d2(文件存 ...

  4. ZOJ3261:Connections in Galaxy War(逆向并查集)

    Connections in Galaxy War Time Limit: 3 Seconds      Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...

  5. rpm的使用:查询、安装、卸载、升级

    RPM 有五种操作模式,分别为:安装.卸载.升级.查询和验证. RPM 安装操作 命令: rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rp ...

  6. spring的普通类中如何取session和request对像

    在使用spring时,经常需要在普通类中获取session,request等对像. 比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts ...

  7. eclipse怎样快速的给代码段添加try catch

    打开要进行异常处理的java代码页面. 选中要添加try..catch的代码段,然后点击鼠标右键,选择[Sourround With]选项. 然后选择[Try/Catch Block]或者[6 try ...

  8. 【Foreign】红与蓝 [暴力]

    红与蓝 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 2 2 0 1 -1 -1 2 0 ...

  9. codefoeces problem 671D——贪心+启发式合并+平衡树

    D. Roads in Yusland Mayor of Yusland just won the lottery and decided to spent money on something go ...

  10. 分布式缓存Memcache

    Memcached是分布式的,也就是说它不是本地的.它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式). Memcached使 ...