社区讨论

站外题

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo2yapzl
此快照首次捕获于
2023/10/23 21:46
2 年前
此快照最后确认于
2023/10/23 21:46
2 年前
查看原帖
CPP
#include<iostream>
#include<cstring>
using namespace std;
int n,ans;//初始ans最少需要n个序列
int a[55];
int up[55],down[55];
void dfs(int u,int su,int sd)//已经搜完了u个导弹,创建了su个上升子序列,sd个下降子序列
{
    if(su+sd>=ans)return;
    if(u==n)
    {
        ans=min(ans,su+sd);
        return;
    }
    
    //第一种情况:放到上升子序列中
    int k=1;
    while(k<=su&&up[k]>=a[u])k++;
    int temp1=up[k];//注意回溯
    up[k]=a[u];
    if(k>su)dfs(u+1,su+1,sd);
    else dfs(u+1,su,sd);
    up[k]=temp1;//回溯
    
    //第二种情况:放到下降子序列中
    k=1;
    while(k<=sd&&down[k]<=a[u])k++;
    int temp2=down[k];
    down[k]=a[u];
    if(k>sd)dfs(u+1,su,sd+1);
    else dfs(u+1,su,sd);
    down[k]=temp2;//注意:搜索这一层的东西就是这一层的,和下一层没关系,下一层的只与传的参数和全局变量有关系
}
int main()
{
    while(cin>>n&&n)
    {
 //     memset(up,0,sizeof up);
//      memset(down,0,sizeof down);
        ans=n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        dfs(0,0,0);
        cout<<ans<<endl;
    }
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...