哈理工1116选美大赛(最长递增子序列)(对dp数组内数据的理解)

本文介绍了一道关于寻找最长递增子序列的问题背景,该问题是通过算法竞赛的形式提出的,旨在找出一排美女中身高递增序列最长的组合。文章提供了一个具体的编程实现案例,利用动态规划解决这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



选美大赛

Time Limit: 1000 MS

Memory Limit: 65536 K

 

Total Submit: 700(183 users)

Total Accepted: 226(151 users)

Rating: 

Special Judge: No

 

Description

一年一度的哈理工选美大赛开始了.来自各个院系的N个美女们都在一起排成一排,然后从左到右给他们标号(1-N),评委叫兽开始观摩,由于身高高低都不同, 叫兽想从中选出尽可能多的人使得他们的身高从左到右依次递增,你能帮助叫兽吗? 

Input

 

输入数据第一行一个数据表示美女的个数N(0<N<100) 

接下来有N个数据表示1-N标号的美女的身高,身高范围都在0-180之内 

当N=0时候输入结束 

 

 

 

Output

 

 

按照样例输出,首先The number is N:N是选出最多美女个数,然后后面输出N个数,代表选出美女的标号,从左到右依次输出. 

题目保证答案唯一 

 

 

 

 

Sample Input

2 1 2 

1 2 3 

Sample Output

The number is 2: 2 3 

The number is 3: 1 2 3 

#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

 

int a[1000];

int dp[1000];

int c[1000];

int b[1000];

int main()

{

    int t;

    while(~scanf("%d",&t))

    {

        memset(dp,0,sizeof(dp));

        if(t==0)break;

        for(int i=0;i<t;i++)

        {

            scanf("%d",&a[i]);

        }

        int ans=1;

                dp[0]=1;

                int cont=0;

                int con=0;

        for(int i=1;i<t;i++)

        {

            int max=0;

            for(int j=0;j<i;j++)

            {

                if(a[i]>a[j]&&max<dp[j])

                {

                        max=dp[j];

                }

            }

            dp[i]=max+1;

            if(dp[i]>ans)ans=dp[i];

        }

        printf("The number is %d:",ans);

        int z=ans;

        for(int i=t-1;i>=0;i--)

        {

            if(dp[i]==ans)

            {

                ans--;

                c[cont]=i+1;

                cont++;

            }

        }

//如果不了解dp的后台数据是很难想到这一点的.

        sort(c,c+z);

        for(int i=0;i<z;i++)

        {

            printf(" %d",c[i]);

        }

        printf("\n");

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值