题解 | #合唱队形#
合唱队形
https://www.nowcoder.com/practice/0045cd3e39634a66ada63c2adeb49234
该题用dp做
该队形是中间最高俩边为低
用俩个数组,一个数组算出从左往右求最大上升子序列
另外一个数组算出从右往左求最大上升子序列
然后俩个数组上的数相加就是队伍最大值+1,
用 N-队伍最大值 即为答案
#include<bits/stdc++.h> using namespace std; int a[1001]; int dp1[1001]; int dp2[1001]; int dp3[1001]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; dp1[i]=1; dp2[i]=0; } for(int i=0;i<n;i++) { for(int j=0;j<i;j++) { if(a[i]>a[j])//最大上升子序列 dp1[i]=max(dp1[i],dp1[j]+1); } } for(int i=n-1;i>=0;i--) { for(int j=n-1;j>i;j--) { if(a[i]>a[j])//最大上升子序列 dp2[i]=max(dp2[i],dp2[j]+1); } } for(int i=0;i<n;i++) { dp3[i]=dp1[i]+dp2[i]; } cout<<n-*max_element(dp3,dp3+n); }