Codeforces.392E.Deleting Substrings(区间DP)
\(Description\)
\(Solution\)
合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i|=1\))。
容易想到区间DP。\(f[i][j]\)表示把区间\([i,j]\)全部删除的最大收益,还需要\(g[i][j]\)表示将区间\([i,j]\)删成连续上升的一段(\(a_i\sim a_j\))的最大收益,\(h[i][j]\)表示将区间\([i,j]\)删成连续下降的一段(\(a_i\sim a_j\))的最大收益。
那么\(g[i][j]\)的元素个数就是\(a_j-a_i+1\),\(h[i][j]\)的元素个数为\(a_i-a_j+1\),合并\(g[i][k],h[k][j]\)后的元素个数就是\(2a_k-a_i-a_j+2-1\)(减掉1个\(a_k\))。
那么$$f[i][j]=\max{f[i][k]+f[k+1][j],\ g[i][k]+h[k][j]+v[2a_k-a_i-a_j+1]}$$
其实\(g,h\)用一个数组就可以了,因为只需要判断一下\(a_i,a_j\)的大小关系,就知道是上升序列还是下降序列了。
最后的答案就是\(f\)的最大子段和。\(n^2\)求出来即可。
//78ms 1100KB
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=405,INF=0x3f3f3f3f;
int A[N],val[N],f[N][N],g[N][N],dp[N];
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int main()
{
int n=read();
for(int i=1; i<=n; ++i) val[i]=read();
for(int i=1; i<=n; ++i) A[i]=read();
for(int i=1; i<=n; ++i)
{
f[i][i]=val[1], g[i][i]=0;
for(int j=i+1; j<=n; ++j) f[i][j]=g[i][j]=-INF;
}
for(int len=1; len<n; ++len)
for(int i=1; i+len<=n; ++i)
{
int j=i+len;
for(int k=i; k<j; ++k)
{
f[i][j]=std::max(f[i][j],f[i][k]+f[k+1][j]);
if((A[i]<A[j] && A[j]==A[k]+1)||(A[i]>A[j] && A[j]==A[k]-1))
g[i][j]=std::max(g[i][j],g[i][k]+f[k+1][j-1]);
}
for(int k=i; k<=j; ++k)
if(A[k]>=A[i] && A[k]>=A[j] && 2*A[k]-A[i]-A[j]+1<=n)//这东西显然不会<=0啊
f[i][j]=std::max(f[i][j],g[i][k]+g[k][j]+val[2*A[k]-A[i]-A[j]+1]);
}
for(int i=1; i<=n; ++i)
{
dp[i]=dp[i-1];
for(int j=1; j<=i; ++j) dp[i]=std::max(dp[i],dp[j-1]+f[j][i]);
}
printf("%d\n",dp[n]);
return 0;
}
Codeforces.392E.Deleting Substrings(区间DP)的更多相关文章
- Codeforces - 149D 不错的区间DP
题意:有一个字符串 s. 这个字符串是一个完全匹配的括号序列.在这个完全匹配的括号序列里,每个括号都有一个和它匹配的括号 你现在可以给这个匹配的括号序列中的括号染色,且有三个要求: 每个括号只有三种情 ...
- Codeforces 983B. XOR-pyramid【区间DP】
LINK 定义了一种函数f 对于一个数组b 当长度是1的时候是本身 否则是用一个新的数组(长度是原数组-1)来记录相邻数的异或,对这个数组求函数f 大概是这样的: \(f(b[1]⊕b[2],b[2] ...
- CodeForces - 1025D: Recovering BST (区间DP)
Dima the hamster enjoys nibbling different things: cages, sticks, bad problemsetters and even trees! ...
- Codeforces 1114D Flood Fill (区间DP or 最长公共子序列)
题意:给你n个颜色块,颜色相同并且相邻的颜色块是互相连通的(连通块).你可以改变其中的某个颜色块的颜色,不过每次改变会把它所在的连通块的颜色也改变,问最少需要多少次操作,使得n个颜色块的颜色相同. 例 ...
- Codeforces 958C3 - Encryption (hard) 区间dp+抽屉原理
转自:http://www.cnblogs.com/widsom/p/8863005.html 题目大意: 比起Encryption 中级版,把n的范围扩大到 500000,k,p范围都在100以内, ...
- CodeForces 149D Coloring Brackets 区间DP
http://codeforces.com/problemset/problem/149/D 题意: 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2 ...
- codeforces 149D Coloring Brackets (区间DP + dfs)
题目链接: codeforces 149D Coloring Brackets 题目描述: 给一个合法的括号串,然后问这串括号有多少种涂色方案,当然啦!涂色是有限制的. 1,每个括号只有三种选择:涂红 ...
- CodeForces - 983B XOR-pyramid(区间dp,异或)
XOR-pyramid time limit per test 2 seconds memory limit per test 512 megabytes input standard input o ...
- Codeforces 607B Zuma(区间DP)
题目大概说,有n个颜色的宝石,可以消除是回文串的连续颜色序列,问最少要几下才能全部消除. 自然想到dp[i][j]表示序列i...j全部消除的最少操作数 有几种消除的方式都能通过枚举k(i<=k ...
随机推荐
- 单个 LINQ to Entities 查询中的两个结构上不兼容的初始化过程中出现类型“XXXX”
最近在做一个报表的时候,用EF使用了Contact方法,但是程式运行一直出错.最近终于找到原因了,写下来提醒下自己.好了,进入正题: 现在我举个栗子,目前数据库中有ParentStudent表和Sub ...
- iOS 中的Certificate,Provisioning Profile 的一些注意 (不断完善中)
注册apple id 有1年多了,这些概念还是模模糊糊的,决定在这里总结一下. 请参阅官方文档 App Distribution Guide code singing的作用如下: Code signi ...
- winform(记事本的打印)
- window 连linux
https://blog.csdn.net/ruanjianruanjianruan/article/details/46954681 https://blog.csdn.net/u013754317 ...
- ubuntu chrome 安装ubuntu16.04 : google浏览器安装及离线插件安装(谷歌访问助手)
1.https://blog.csdn.net/cheneykl/article/details/79187954 https://download.oracle.com/otn-pub/java/j ...
- laravel 接口跨域
最方便的方法,新建一个middleWare,把这个middleware加入到全局中间件,所有的请求,都会经过这个中间件的过滤. php artisan make:middleware CrossHtt ...
- django----对model查询扩展
基于对象关联查询 一对多查询(Book--Publish): 正向查询,按字段: (从关联的表中查询) book_obj.publish : 与这本书关联的出版社对象 book_obj.publish ...
- pytest十三:配置文件 pytest.ini
pytest 配置文件可以改变 pytest 的运行方式,它是一个固定的文件 pytest.ini 文件,读取配置信息,按指定的方式去运行. ini 配置文件pytest 里面有些文件是非 test ...
- 绝对定位后,position:absolute;不能使用margin: 0 auto;实现居中;
声明: web小白的笔记,欢迎大神指点!联系QQ:1522025433. 我们都知道margin: 0 auto:可也实现块状元素的水平居中:但是对于绝对顶为的元素就会失效: 请看实例: <!d ...
- ERP合同管理流程查询(三十一)
根据任务表编号,及相关表单编号获取当前流程表的编号: CREATE FUNCTION [dbo].[FN_GetDynamicId] ( @tasktableid INT, @taskid INT ) ...