合唱队形(lgP1091)
思路:
先从左到右求一遍最长不下降子序列,再同样方法从右到左求一遍。
然后我们枚举分界点,则总人数就是左边一半加上右边一半的人数。
取最大值,输出答案。
见注释。
#include<bits/stdc++.h> using namespace std; int n,a[101],f1[101],f2[101],ans; int main() { cin>>n; for(int i = 1;i <= n;i ++) cin>>a[i]; for(int i = 1;i <= n;i ++)//此处是从左到右求 { for(int j = 0;j < i;j ++) { if(a[i] > a[j]) f1[i] = max(f1[i],f1[j] + 1); } } for(int i = n;i;i --)//从右到左求 { for(int j = n + 1;j > i;j--) { if(a[i] > a[j]) f2[i] = max(f2[i],f2[j]+1); } } for(int i = 1;i <= n;i ++) ans = max(f1[i] + f2[i] - 1,ans);//枚举分界点并更新答案 cout<<n-ans; return 0; }
用时 25min ,一遍过。
本文来自博客园,作者:樱雪喵,转载请注明原文链接:https://www.cnblogs.com/ying-xue/p/14087915.html