题目描述

花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。

具体而言,栋栋的花的高度可以看成一列整数h1,h2...hn。设当一部分花被移走后,剩下的花的高度依次为g1,g2...gm,则栋栋希望下面两个条件中至少有一个满足:

注意上面两个条件在m=1时同时满足,当m>1时最多有一个能满足。

请问,栋栋最多能将多少株花留在原地。

思路

(这种算法很慢,而且比起贪心可能更难理解。但是在dp中算是最直接的一种办法

首先看到这题很容易想到LIS(最长上升子序列)

于是开两个数组表示条件a和条件b,一个整数i表示到第i个数的最大长度,并用0或1来表示接下来要选更大的还是更小的。

然后就……就TLE了。代码:

#include<iostream>

using namespace std;

int a[],fa[][],fb[][],n;

int main()
{
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i];
fa[][]=fb[][]=fa[][]=fb[][]=;
for(register int i=;i<=n;i++)
{
for(register int j=;j<i;j++)
{
if(a[j]<a[i])
{
fb[i][]=max(fb[i][],fb[j][]+);
fa[i][]=max(fa[i][],fa[j][]+);
}
if(a[j]>a[i])
{
fb[i][]=max(fb[i][],fb[j][]+);
fa[i][]=max(fa[i][],fa[j][]+);
}
}
}
cout<<max(fb[n][],max(fa[n][],max(fb[n][],fa[n][])));
return ;
}

但是这题不像LIS,它只需要上一个数比他小(大)就行了,只要在前面找到一个比他小的数,那就肯定表明这个数之前的序列都更短。

所以每次从后往前搜,能转移就转移。更大和更小都转移完了之后,就能够从中选取答案了。

代码:

#include<iostream>
using namespace std; int a[],fa[][],fb[][],n;
bool flag1,flag2; int main()
{
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i];
fa[][]=fb[][]=fa[][]=fb[][]=;
for(register int i=;i<=n;i++)
{
flag1=flag2=;
for(register int j=i;j>=&&(flag1||flag2);j--)
{
if(a[j]<a[i])
{
flag1=;
fb[i][]=max(fb[i][],fb[j][]+);
fa[i][]=max(fa[i][],fa[j][]+);
}
if(a[j]>a[i])
{
flag2=;
fb[i][]=max(fb[i][],fb[j][]+);
fa[i][]=max(fa[i][],fa[j][]+);
}
}
}
cout<<max(fb[n][],max(fa[n][],max(fb[n][],fa[n][])));
return ;
}

洛谷 P1970 花匠的更多相关文章

  1. DP练习题——洛谷P1970花匠

    目录 题目描述: 输入输出格式: 输入格式: 输出格式: 输入输出样例: 输入样例: 输出样例: 题目分析: 解法一: 解法二: 结语: 题目描述: 洛谷\(P1970\) 花匠栋栋种了一排花,每株花 ...

  2. [NOIP2013] 提高组 洛谷P1970 花匠

    题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排列得比较别致. 具 ...

  3. 洛谷 P1970 花匠 —— DP

    题目:https://www.luogu.org/problemnew/show/P1970 普通的DP,f[i][0/1] 表示 i 处处于较小或较大的长度: 注意:1.树状数组向后 query 时 ...

  4. 洛谷——P1970 花匠

    https://www.luogu.org/problem/show?pid=1970 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走, ...

  5. 洛谷P1970 花匠

    传送门 首先可以知道,如果一个序列是连续上升的,那么只需要取这一个序列中最高的元素即可,因为取其它的不能保证大于后面的.连续下降的序列同理.而这些恰好就是波峰和波谷. 所以遇到 $ j $ 比之前的 ...

  6. 洛谷P1970 花匠(dp)

    题意 题目链接 Sol 直接用\(f[i][0/1]\)表示到第\(i\)个位置,该位置是以上升结尾还是以下降结尾 转移的时候只需枚举前一个即可 #include<cstdio> #inc ...

  7. 洛谷P1970 [NOIP2013提高组Day2T2] 花匠

    P1970 花匠 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排 ...

  8. 【洛谷p1970】花匠

    莫得致敬lz谢谢.lz的题解是优秀的题解谢谢! 看算法标签 但是我并不会DP的思路,用一个很神奇的码量超级少的代码(虽然我码了超多),然后其实这个数据可以看做是一个函数嘛对吧:(比如说样例) 那么要注 ...

  9. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

随机推荐

  1. qt技巧--使用html导出表格替代excel

            曾经为qt不能直接导出excel而困扰,后来经过深入了解,得知qt支持xml国际语言,html是xml的一种.html是做网页的,相信大家比较熟悉.所以使用html的<table ...

  2. Windows完成端口与猪肉佬

    首先应该说明的是,我也是第一次使用完成端口.虽然以前偶尔在网上看到完成端口的文章和代码,但真正自己动手写还是第一次,不过我这个人有个特点就是大胆,例如没有写那个界面编程系列前,其实我甚至不知道原来一个 ...

  3. tftp的安装及配置

    1.安装tftp服务客户端sudo apt-get install tftp 2.安装tftp服务器端sudo apt-get install tftpd 3.安装xinetd注意同类似的还有open ...

  4. Qt:移动无边框窗体(使用Windows的SendMessage)

    移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...

  5. MinGW64 how-to(内含编译openssl,libjpeg,libcurl等例子)

    Index of contents Setting up the MinGW 64 environment Step 1) building libiconv Step 2) building lib ...

  6. 针对TianvCms的搜索优化文章源码(无版权, 随便用)

    介绍: 搜索优化虽然不是什么高深的技术, 真正实施起来却很繁琐, 后台集成搜索优化的文章可以便于便于管理, 也让新手更明白优化的步奏以及优化的日常. 特点: 根据自己的经验和查阅各种资料整理而成, 相 ...

  7. 全量导入数据 导致solr内存溢出 崩溃问题解决

    在 data-config.xml 文件中 增加一个参数即可: batchSize="-1"    

  8. 解决npm install卡住不动的小尴尬

    npm install卡顿问题记录 遇到的问题 npm install -g @angular/cli 安装angular cli工具时,发现进度条一直卡住不动,相信很多朋友也遇到过.原因应该是国内的 ...

  9. hgoi#20190519

    更好的阅读体验 来我的博客观看 T1-求余问题 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组{1},{1,1,1},{1,2,1},{1,3,2 ...

  10. Spark学习之路(九)—— Spark SQL 之 Structured API

    一.创建DataFrame和Dataset 1.1 创建DataFrame Spark中所有功能的入口点是SparkSession,可以使用SparkSession.builder()创建.创建后应用 ...