博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1091 合唱队形
阅读量:5325 次
发布时间:2019-06-14

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

嗯...

 

题目链接:

很明显这是一道dp题,求最长上升/下降子序列...

但这道题中既有上升序列,也有下降序列,所以我们把 f 数组设成二维,f[i][1]表示开始的上升子序列,f[i][2]表示后来的下降子序列(其实可以开两个数组)。依次枚举每一个点,把它当做中间最高的那一个,然后求出它的最长上升/下降子序列,最后枚举一遍,找一个最长的即可。

 

动态转移方程(首先要判断是否符合上升/下降):

f[i] = max (f[i], f[j] + 1);

 

AC代码:

1 #include
2 #include
3 4 using namespace std; 5 6 int f[305][3], t[105], ans; 7 8 int main(){ 9 int n;10 scanf("%d", &n);11 for(int i = 1; i <= n; i++)12 scanf("%d", &t[i]);13 for(int i = 1; i <= n; i++){14 for(int j = 0; j < i; j++){15 if(t[j] < t[i]) f[i][1] = max(f[i][1], f[j][1] + 1);//首先要判断 16 }17 } 18 for(int i = n; i >= 1; i--){19 for(int j = n + 1; j > i; j--){20 if(t[i] > t[j]) f[i][2] = max(f[i][2], f[j][2] + 1);21 }22 }23 for(int i = 1; i <= n; i++){24 ans = max(ans, f[i][2] + f[i][1] - 1);//ans是队列中人数 25 }26 printf("%d\n", n - ans);27 return 0;28 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11230310.html

你可能感兴趣的文章
NTP服务器配置
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>
RxJS & Angular
查看>>
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>