博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[luogu4728 HNOI2009] 双递增序列 (dp)
阅读量:5297 次
发布时间:2019-06-14

本文共 1050 字,大约阅读时间需要 3 分钟。

Solution

前几天刚做了类似题,这种将一个序列拆分为两个单调序列的题一般都是设\(dp[i]\)表示i为一个单调序列的末尾时,另一个序列的末尾是多少

然后应用贪心的思想,在这道题中就是让另一个序列末尾最小。
另外这道题还有长度的限制,不过由于总长知道,只需记其中一个的序列长度即可

Code

//By Menteur_Hxy#include 
#include
#include
#include
#include
#include
#define Re register#define Ms(a,b) memset(a,(b),sizeof(a))#define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)#define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--)using namespace std;inline int read() { int x=0,f=1;char c=getchar(); while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();} while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar(); return x*f;}const int N=2048,INF=0x3f3f3f3f;int n,T;int da[N],f[N][N];int main() { T=read(); while(T--) { n=read(); Fo(i,1,n) da[i]=read(); Ms(f,0x3f); f[0][0]=da[0]=-1; Fo(i,1,n) Fo(j,0,i) { if(da[i]>da[i-1]) f[i][j]=min(f[i][j],f[i-1][j]); if(da[i]>f[i-1][i-j]) f[i][j]=min(f[i][j],da[i-1]); } puts(f[n][n/2]==INF?"No!":"Yes!"); } return 0;}

转载于:https://www.cnblogs.com/Menteur-Hxy/p/9810572.html

你可能感兴趣的文章
简明 Vim 练级攻略【转】
查看>>
AC日记——Rmq Problem bzoj 3339
查看>>
AC日记——[SDOI2009]HH的项链 洛谷 P1972
查看>>
"undefined reference to" 多种可能出现的问题解决方法
查看>>
linux; 文件名乱码;问价名出现问号
查看>>
15. 3Sum
查看>>
JavaSE第十天20160816
查看>>
ListView
查看>>
【ASP.NET】@RenderBody,@RenderPage,@RenderSection的使用
查看>>
博客园 之 “水王”
查看>>
CentOS6 切换启动时的图形/文本界面的分析
查看>>
Linux 2.6 中的文件锁
查看>>
E. Train Hard, Win Easy
查看>>
放下心情,从最基础的开始来学习Javascript!
查看>>
JS实现图片的选择并预览,并且能删除
查看>>
PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集...
查看>>
codeforces E - Anya and Cubes 分块处理 暴力搜索
查看>>
Unity3d UGUI序列帧动画
查看>>
如何给spine骨骼动画挂载粒子特效
查看>>
POJO、JavaBean、DTO的区别
查看>>