传送门

一道感觉比较简单的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,这个时候就体现了翻转的转移,而上面两种情况却是不翻转时的转移。

其它边界都不难,参见代码吧。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,a[55],f[55][55][55][55],ans=0;
  4. int main(){
  5. scanf("%d",&n);
  6. for(int i=1;i<=n;++i)scanf("%d",&a[i]);
  7. for(int i=1;i<=n;++i)
  8. for(int j=1;j<=a[i];++j)
  9. for(int k=a[i];k<=n;++k)
  10. f[i][i][j][k]=1;
  11. for(int len=2;len<=n;++len)
  12. for(int l=1,r=len;r<=n;++l,++r)
  13. for(int num=1;num<=50;++num)
  14. for(int d=1,u=num;u<=50;++d,++u){
  15. f[l][r][d][u]=max(f[l][r][d][u],max(f[l][r][d+1][u],f[l][r][d][u-1]));
  16. 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)));
  17. f[l][r][d][u]=max(f[l][r][d][u],f[l+1][r-1][d][u]+(a[r]==d)+(a[l]==u));
  18. }
  19. cout<<f[1][n][1][50];
  20. return 0;
  21. }

2018.08.16 洛谷P3607 [USACO17JAN]序列反转(线性dp)的更多相关文章

  1. 2018.08.16 洛谷P1471 方差(线段树)

    传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...

  2. 2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)

    传送门 看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的 ...

  3. 2018.08.16 洛谷P2029 跳舞(线性dp)

    传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...

  4. 2018.07.09 洛谷P2365 任务安排(线性dp)

    P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  5. 【题解】洛谷P1070 道路游戏(线性DP)

    次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...

  6. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  7. 2018.08.28 洛谷P4556 [Vani有约会]雨天的尾巴(树上差分+线段树合并)

    传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h& ...

  8. 2018.08.28 洛谷P3803 【模板】多项式乘法(FFT)

    传送门 fft模板题. 终于学会fft了. 这个方法真是神奇! 经过试验发现手写的complex快得多啊! 代码: #include<iostream> #include<cstdi ...

  9. 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)

    传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...

随机推荐

  1. 12.使用default-Action配置统一访问

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html default-action-ref,当访问没有找到对应的action时,默 ...

  2. 在Textbox中按回车键后继续获取焦点

    textbox的值为空或没有更改时,按下回车键textbox会失去焦点 此时用textbox1.setfocus不能使textbox1重新获取焦点 Private Sub Textbox1_KeyDo ...

  3. vue - iview UI组件的col标签报错 x-invalid-end-tag

    https://blog.csdn.net/xiao199306/article/details/80430087

  4. 为什么NoSql快--磁盘顺序写

    数据写入方式 1.  update-in-place原地更新 2.  append-only btree/copy on write tree顺序文件末尾追加   数据被按照特定方式放置,提升读性能, ...

  5. mysql大表优化

    https://segmentfault.com/a/1190000006158186 https://tech.meituan.com/mysql-index.html http://www.cnb ...

  6. Gearman简介

    gearman,从名字上看叫做“齿轮工”,就是通过齿轮把不同的组件组合在一起.通常,多语言多系统之间的集成是项目开发中一个比较头疼的问题.一般会采用RPC风格或者是REST风格的WebService. ...

  7. 查询sql执行速度

    with QS as(      select cp.objtype as object_type            ,db_name(st.dbid)as [database]          ...

  8. js中声明函数的方法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. ubuntu修改运行级别方法

    Ubuntu系统设置启动级别的问题,因自己以前遇到过,故做过笔记记录了下来:Ubuntu.Debian系列与RedHat.CentOS启动级别含义有所区别:Ubuntu系列运行级别定义如下:0 – H ...

  10. XtraBackup 备份原理

    来着淘宝技术: http://mysql.taobao.org/monthly/2016/03/07/ https://github.com/alibaba/AliSQL 前言 Percona Xtr ...