DP 合唱队形 尼谷P1091

题面在这里

请各位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;
}

The end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值