题面在这里
请各位DALAO自行看题。。。
其实就是最长上升序列加最长下降序列。
思路:
像上面所述,最长上升+最长下降啊啊啊
附上ZCSS及ZCXJ代码:
上升:这里显然不是最长不下降。。。。
请看图
出处:blog.csdn.net/lxt_Lucia/article/details/81206439
#include <bits/stdc++.h>
#define qwq int
#define maxn 105
#define INF -0x7f7f7f
using namespace std;
qwq a[maxn], f[maxn];
qwq n,ans = INF;
qwq main(){
scanf("%d", &n);
for(qwq i=1; i<=n; i++) {
scanf("%d", &a[i]);
f[i] = 1;//初始化QAQ
}
for(qwq i=1; i<=n; i++)
for(qwq j=1; j<i; j++)
if(a[j] < a[i])//状态转移
f[i] = max(f[i], f[j]+1);//O(n^2)的算法,非最优解,但老师没讲别的QAQ
for(qwq i=1; i<=n; i++)
ans = max(ans, f[i]);
printf("%d\n", ans);
return 0;
}
下降:这里也显然不是最长不上升。。。。
和上升差不多吧我不知道
反正我的代码差不多:
#include <bits/stdc++.h>
#define qwq int
#define maxn 105
#define INF -0x7f7f7f
using namespace std;
qwq a[maxn], f[maxn];
qwq n,ans = INF;
qwq main(){
scanf("%d", &n);
for(qwq i=1; i<=n; i++) {
scanf("%d", &a[i]);
f[i] = 1;
}
for(qwq i=1; i<=n; i++)
for(qwq j=1; j<i; j++)
if(a[j] > a[i])//改个符号而已,具体同上
f[i] = max(f[i], f[j]+1);
for(qwq i=1; i<=n; i++)
ans = max(ans, f[i]);
printf("%d\n", ans);
return 0;
}
突然发现是求弹出的人数啊
其实我觉得与其大刀阔斧地该为求弹出人数,倒不如总人数减去满足人数。
代码:
#include<bits/stdc++.h>//看起来短,实际也短哈哈哈,
#define qwq int//发扬压行精神
#define WO_SHI_JU_RUO 105
using namespace std;
int n,a[WO_SHI_JU_RUO],f[2][WO_SHI_JU_RUO],ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);a[0]=0;
for(int i=1;i<=n;i++) for(int j=0;j<i;j++) if(a[i]>a[j]) f[0][i]=max(f[0][i],f[0][j]+1); a[n+1]=0;
for(int i=n;i;i--)for(int j=n+1;j>i;j--) if(a[i]>a[j]) f[1][i]=max(f[1][i],f[1][j]+1);
for(int i=1;i<=n;i++) ans=max(f[0][i]+f[1][i]-1,ans);
printf("%d\n",n-ans);
return 0;
}