Codevs 1058 合唱队形 ---2004年NOIP全国联赛提高组 dp
2016-10-30 10:48
330 查看
Codevs 1058 合唱队形 —2004年NOIP全国联赛提高组
枚举中间的最高点跑最长上升和最长下降子序列。
注意,单调的数据答案是 0。真是一个好题, 数据在注释里。
枚举中间的最高点跑最长上升和最长下降子序列。
注意,单调的数据答案是 0。真是一个好题, 数据在注释里。
#include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> #include <algorithm> using namespace std; #define MAXN (100+10) int a[MAXN], dp[MAXN], za[MAXN]; #define INF (1e9) int main() { int n; cin >> n; for(int i = 1, j = n; i <= n && j >= 1; i ++, j --) scanf("%d", &a[i]), za[j] = a[i]; bool up = 0, down = 0; for(int i = 1; i < n; i ++) if(a[i] < a[i+1]) down = 1; else if(a[i] > a[i+1]) up = 1; if((up && !down) || (down && !up)) { puts("0"); return 0; } int ans = 0; for(int nn = 2; nn < n; nn ++) { int cnt = 0; fill(dp+1, dp+n+1, INF); for(int i = 1; i < nn; i ++) if(a[i] < a[nn]) dp[lower_bound(dp+1, dp+n+1, a[i])-dp] = a[i]; cnt += (lower_bound(dp+1, dp+n+1, INF)-dp-1); fill(dp+1, dp+n+1, INF); for(int i = 1; i < n-nn+1; i ++) if(za[i] < za[n-nn+1]) dp[lower_bound(dp+1, dp+n+1, za[i])-dp] = za[i]; cnt += (lower_bound(dp+1, dp+n+1, INF)-dp-1); cnt ++; ans = max(ans, cnt); } cout << n-ans << endl; return 0; } /* 输入数据 (显示前20行) 20 130 140 150 160 170 180 190 200 210 220 221 222 223 224 225 226 227 228 229 230 你的答案 < 1 正确答案 > 0 */
相关文章推荐
- codevs 1058 合唱队形 2004年NOIP全国联赛提高组
- 1058 合唱队形 2004年NOIP全国联赛提高组
- 1058 合唱队形 2004年NOIP全国联赛提高组
- 合唱队形 2004年NOIP全国联赛提高组
- 2004年分区联赛提高组之三 合唱队形(dp)
- codevs 1057 津津的储蓄计划 2004年NOIP全国联赛提高组 x
- 2004年分区联赛提高组之三 合唱队形(dp)
- Codevs1154 能量项链 ——2006年NOIP全国联赛提高组 区间dp
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
- Codevs 1105 过河 2005年NOIP全国联赛提高组
- Codevs 1217 借教室 2012年NOIP全国联赛提高组
- 1068 乌龟棋 2010年NOIP全国联赛提高组 dp 难
- 【NOIP2004】CODE[VS] 1058 合唱队形(序列型DP)
- 【codevs 1315】1315 摆花2012年NOIP全国联赛普及组(dp)
- Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
- Codevs 1173 最优贸易 2009年NOIP全国联赛提高组
- 【Codevs】1197 Vigenère密码 --2012年NOIP全国联赛提高组
- 虫食算 2004年NOIP全国联赛提高组(dfs)
- 【codevs 1106】篝火晚会 (2005年NOIP全国联赛提高组)(置换群)
- codevs 1173 最优贸易 2009年NOIP全国联赛提高组(spfa)