洛谷 P1091合唱隊列
阿新 • • 發佈:2019-09-16
吾王劍之所指,吾等心之所向 ——《Fate/stay night》
題目:https://www.luogu.org/problem/P1091
這題應該來說,是一道比較經典,也比較簡單的動規題。
它的模板性質也很明顯——
就是最長上升子序列
所以應該會動規的看見那個T1<T2<...<Ti>Ti+1>...>Tk就知道了吧
那這題還要考慮一點點,出去的最少,就意味著留下的最多,
那麼LIS實錘:
只要把每個點為首的 的向左的最長下降子序列以及它 的向右的最長上升子序列 都求出來,然後相加,就是它為中央的留下的最多人數了。
好了,上程式碼:
#include<bits/stdc++.h> using namespace std; int n,maxn=0; int a[105]; int f[105][4]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); f[i][1]=f[i][2]=1; } for(int i=2;i<=n;i++) { for(int j=1;j<i;j++) { if(a[i]>a[j]&&f[j][1]>=f[i][1]) { f[i][1]=f[j][1]+1; } } } for(int i=n-1;i>=1;i--) { for(int j=i+1;j<=n;j++) { if(a[i]>a[j]&&f[j][2]>=f[i][2]) { f[i][2]=f[j][2]+1; } } }//求最長上升子序列和最長下降子序列 for(int i=1;i<=n;i++) { f[i][3]=f[i][1]+f[i][2]-1; if(f[i][3]>maxn) maxn=f[i][3];//這是保留的人數 } printf("%d\n",n-maxn);//n-maxn是踢掉的人數 return 0; }
我最開始輸出的是maxn,結果就過了兩個點
還是那句話——
細節決定成敗啊!!!!!<