洛谷 P1091合唱队列
吾王剑之所指,吾等心之所向 ——《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,结果就过了两个点
还是那句话——
细节决定成败啊!!!!!