[USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)
题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度
tips:子序列可以不连续,但不能破坏在原序列中的顺序
观察数据范围,n<=50,很小,考虑dfs
*dfs来跑区间dp可以巧妙的解决区间两端元素的置换问题
记忆化搜索,f[i][j][l][r] 代表对于区间[i,j],构成最长不下降子序列的元素值域在[l,r]时,最长不下降子序列的长度
注意特判端点
#include <bits/stdc++.h>
#define N 55
#define inf 0x3f3f3f3f
using namespace std; int n,m;
int a[N],f[N][N][N][N];
int dfs(int i,int j,int l,int r)
{
int ans=-;
if(f[i][j][l][r]!=-) {return f[i][j][l][r];}
if(l>r) {return -;}
if(i>j) {return ;}
if(i==j&&l<=a[i]&&a[i]<=r) {f[i][j][l][r]=;return ;}
if(i==j&&(a[i]<l||a[i]>r)) {f[i][j][l][r]=;return ;}
ans=max(ans,dfs(i+,j,l,r));
ans=max(ans,dfs(i,j-,l,r));
ans=max(ans,dfs(i+,j-,l,r));
if(l<=a[i]&&a[i]<=r) {ans=max(ans,dfs(i+,j,a[i],r)+);}
if(l<=a[j]&&a[j]<=r) {ans=max(ans,dfs(i,j-,l,a[j])+);}
if(l<=a[i]&&a[i]<=a[j]&&a[j]<=r) {ans=max(ans,dfs(i+,j-,a[i],a[j])+);} if(l<=a[j]) {ans=max(ans,dfs(i+,j-,a[j],r)+);}
if(a[i]<=r) {ans=max(ans,dfs(i+,j-,l,a[i])+);}
if(r>=a[i]&&a[i]>=a[j]&&a[j]>=l) {ans=max(ans,dfs(i+,j-,a[j],a[i])+);}
f[i][j][l][r]=max(,ans);
return ans;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{scanf("%d",&a[i]);}
memset(f,-,sizeof(f));
printf("%d",dfs(,n,,));
return ;
}
[USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)的更多相关文章
- [USACO17JAN]Subsequence Reversal序列反转
题目描述 Farmer John is arranging his NN cows in a line to take a photo (1 \leq N \leq 501≤N≤50). The he ...
- 不要62 hdu 2089 dfs记忆化搜索
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...
- dfs+记忆化搜索,求任意两点之间的最长路径
C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...
- hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)
pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1078(dfs记忆化搜索)
题意:容易理解... 思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的, ...
- UVA 10400 Game Show Math (dfs + 记忆化搜索)
Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...
- 8636 跳格子(dfs+记忆化搜索)
8636 跳格子 该题有题解 时间限制:2457MS 内存限制:1000K提交次数:139 通过次数:46 题型: 编程题 语言: G++;GCC Description 地上有一个n*m 的数 ...
- P1433 吃奶酪(搜索DFS+记忆化)
emmmmm,我还是看了题解的....尴尬,其实不用记忆化搜索也是可以的.因为我不用也是最后一个点超时.但是我是用的贪心+DFS...超时的原因是贪心....mmp,本来加贪心就是为了不超时.... ...
- POJ 1088 滑雪(模板题 DFS+记忆化)
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
随机推荐
- 兼容IE的两端对齐
div+css布局实现2端对齐是我们网页排版中经常会使用到的,这篇文章将总结一下可以实现的方法: html结构 实现demo里面的div通过Css进行2端对齐. <div class=" ...
- 使用python脚本定时备份web网站
#!/usr/bin/env python #-*- coding: utf-8 -*- import os import time # 备份的指定目录 source = ['/data/www/Ad ...
- 03.IO读写-2.用with open进行文件读写
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...
- some untracked working tree files问题解决
我使用的是idea,情境是在使用git同步代码的时候,出现的错误. 我这里报错是在右上角的显示信息,其中有一个show view的可点击连接 我点击之后将上面展示的文件删除之后重新同步代码,成功.
- Linux--对文件夹下的配置文件批量改动IP
sed -i 's/10.1.1.1/10.1.1.2/g' `grep -ir 10.1.1.1 * |grep -E '.xml:|.cfg:|.ini:|.wsdl:|.properties:' ...
- OC第三天(内存管理)
内存管理: 1.作用范围: 不论什么继承了NSObject的对象,堆基本数据类型无效如:int a ,float price;;等 2.原理: 每一个对象内部都保存了一个与之相关的整数,称为引用计数器 ...
- 2014秋C++ 第7周项目 数据类型和表达式
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课 ...
- angularjs1-7,http,location
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- bzoj5288: [Hnoi2018]游戏
我还是太年轻了... 考场上就是直接枚举预处理当前位置左右延伸到的最远距离,好像是水了20.. 然后噶爷爷居然随机一下就AC了????mengbier #include<cstdio> # ...
- JAVA设计模式之【原型模式】
1.案例一 学生复制 package Prototype; /** * Created by Jim on 2016/10/1. */ public class Student implements ...