2018.08.16 洛谷P3607 [USACO17JAN]序列反转(线性dp)
传送门
一道感觉比较简单的dp。
注意是要求翻转一个子序列而不是一段连续的数(被坑了很多次啊)。。。
看到数据范围果断开一个四维数组来dp一波。
我们显然可以用f[i][j][k][t]表示下标在[l,r]内,值域在[k,t]之间且最多只会翻转一次能够生成的最长不下降子序列。
这不就简单了吗,从[l(+1),r(-1)]转移过来就三种情况。
第一种:该区间的值可以从[l+1,r]转移过来,如果a[l]=k的话对当前区间的贡献加1。
第二种:该区间的值可以从[l,r-1]转移过来,如果a[r]=t的话对当前区间的贡献加1。
第三种:该区间的值可以从[l+1,r-1]转移过来,与上面两种不一样的是,如果a[l]=t的对当前区间的贡献加1,如果a[r]=k的话对当前区间的贡献也加1,这个时候就体现了翻转的转移,而上面两种情况却是不翻转时的转移。
其它边界都不难,参见代码吧。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[55],f[55][55][55][55],ans=0;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
for(int j=1;j<=a[i];++j)
for(int k=a[i];k<=n;++k)
f[i][i][j][k]=1;
for(int len=2;len<=n;++len)
for(int l=1,r=len;r<=n;++l,++r)
for(int num=1;num<=50;++num)
for(int d=1,u=num;u<=50;++d,++u){
f[l][r][d][u]=max(f[l][r][d][u],max(f[l][r][d+1][u],f[l][r][d][u-1]));
f[l][r][d][u]=max(f[l][r][d][u],max(f[l][r-1][d][u]+(a[r]==u),f[l+1][r][d][u]+(a[l]==d)));
f[l][r][d][u]=max(f[l][r][d][u],f[l+1][r-1][d][u]+(a[r]==d)+(a[l]==u));
}
cout<<f[1][n][1][50];
return 0;
}
2018.08.16 洛谷P3607 [USACO17JAN]序列反转(线性dp)的更多相关文章
- 2018.08.16 洛谷P1471 方差(线段树)
传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...
- 2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)
传送门 看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的 ...
- 2018.08.16 洛谷P2029 跳舞(线性dp)
传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...
- 2018.07.09 洛谷P2365 任务安排(线性dp)
P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...
- 【题解】洛谷P1070 道路游戏(线性DP)
次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- 2018.08.28 洛谷P4556 [Vani有约会]雨天的尾巴(树上差分+线段树合并)
传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h& ...
- 2018.08.28 洛谷P3803 【模板】多项式乘法(FFT)
传送门 fft模板题. 终于学会fft了. 这个方法真是神奇! 经过试验发现手写的complex快得多啊! 代码: #include<iostream> #include<cstdi ...
- 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)
传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...
随机推荐
- 2.vo传参模式和ModerDriven传参模式
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html Copy上面的myStruts2项目,改名为myStruts2Vo项目.作如 ...
- 浅谈RMI的特点及作用
RMI:远程方法调用(Remote Method Invocation) 扩展:RPC与RMI的区别 1:方法调用方式不同: RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用.每个远 ...
- Spring MVC 异常处理 - SimpleMappingExceptionResolver
希望对一些异常统一处理,他将异常类名映射为视图名,即发生异常时使用对应的视图报告异常.
- libcurl 支持openssl 但不能访问https
重新编译了libcurl 去访问https 地址还是不能访问 从网上找到了解决方案: curl有两种方式使用https : 1. 设定为不验证证书和HOST code = curl_easy_seto ...
- libcurl 不支持https访问
项目中使用libcurl 访问https的时候会报错,比如:“Unsupported protocol” 或者:“Protocol https not supported or disabled in ...
- 16 python 异常处理
1.了解什么是异常处理 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止), 在python中,错误触发的异常如下 2.了解 ...
- event bManualResult
MSDN: bManualReset [in] If this parameter is TRUE, the function creates a manual-reset event object, ...
- 【转】vc api 录音
一.数字音频基础知识 Fourier级数: 任何周期的波形可以分解成多个正弦波,这些正弦波的频率都是整数倍.级数中其他正线波的频率是基础频率的整数倍.基础频率称为一级谐波. PCM: pulse co ...
- focusin 事件| focusout事件
focusin 定义和用法 当元素(或在其内的任意元素)获得焦点时发生 focusin 事件. 当在元素或在其内的任意元素上发生 focus 事件时,focusin() 方法添加要运行的函数. 与 f ...
- Java时间操作常用api
- 如何取得年月日.小时分钟秒?- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?- 如何取得某月的最后一天?- 如何格式化日期?答:问题1:创建java.util.Calendar 实例, ...