[CF392E]Deleting Substrings
“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的更多相关文章
- Codeforces.392E.Deleting Substrings(区间DP)
题目链接 \(Description\) \(Solution\) 合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i| ...
- CCPC2018-湖南全国邀请赛 G String Transformation
G.String Transformation 题目描述 Bobo has a string S = s1 s2...sn consists of letter a , b and c . He ca ...
- [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...
- Leetcode: Unique Substrings in Wraparound String
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...
- 云硬盘error、error deleting、deleting状态(数据库基本操作小记)
起因是发现云硬盘显示删光了,但还是创建不了新的云硬盘,在api节点上用cinder list可以看到已经没有硬盘了,但是创建硬盘时,还是会提示配额满了,这是因为数据库里的记录没有更新,对数据库的操作记 ...
- Failed deleting my ephemeral node
2017-01-05 11:07:39,490 WARN zookeeper.RecoverableZooKeeper: Node /hyperbase1/rs/tw-node1217,60020,1 ...
- CSU-1632 Repeated Substrings (后缀数组)
Description String analysis often arises in applications from biology and chemistry, such as the stu ...
- 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 ...
- CF451D Count Good Substrings (DP)
Codeforces Round #258 (Div. 2) Count Good Substrings D. Count Good Substrings time limit per test 2 ...
随机推荐
- git使用笔记(八)团队协作
By francis_hao Nov 24,2016 本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可.欢迎转载,请注明出处 ...
- 480000 millis timeout while waiting for channel to be ready for write异常处理
2014-08-25 15:35:05,691 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration( ...
- ICE学习笔记一----运行官方的java版demo程序
建议新手和我一样,从官网下载英文文档,开个有道词典,慢慢啃. 官方文档下载: http://download.csdn.net/detail/xiong_mao_1/6300631 程序代码就不说了, ...
- SpringBoot入门学习(一): Idea 创建 SpringBoot 的 HelloWorld
创建项目: 项目结构: 程序启动入口: 正式开始: package com.example.demo; import org.springframework.boot.SpringApplicatio ...
- html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍(转载)
HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth scrollHeight: 获取对象的滚动高度. scrollLeft: 设置或获取位于 ...
- Shell之基本用法
一:shell简介 1.什么是shell shell的中文意思是“外壳”,通俗地讲,shell是一个交互编程接口,通过获得用户输入来驱动操作系统内核完成指定工作.shell除了作为命令解释程序以外,还 ...
- A trick in Exploit Dev
学习Linux BOF的时候,看了这个文章,https://sploitfun.wordpress.com/2015/06/23/integer-overflow/ ,原文给出的exp无法成功, 此时 ...
- mysql五-1:单表查询
一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...
- C++类学习
一.C++类的定义 C++中使用关键字 class 来定义类, 其基本形式如下:class 类名{ public: //行为或属性 protected: //行为或属性 private: / ...
- c++文件流写入到execl中
#include <iostream> #include <fstream> #include <string> using namespace std; int ...