九度 题目1262:Sequence Construction puzzles(I)

xiaoxiao2021-02-27  331

题目描述:

给定一个整数序列,请问如何去掉最少的元素使得原序列变成一个全递增的序列。

输入:

输入的第一行包括一个整数N(1<=N<=10000)。 接下来的一行是N个满足题目描述条件的整数。

输出:

可能有多组测试数据,对于每组数据, 输出去掉最少的元素后的全递增序列。

样例输入: 8 186 186 150 200 160 130 197 220 样例输出: 150 160 197 220 提示:

如果有多个结果序列满足条件,输出相对位置靠前的那个序列。

/

明显用dp,dp[j][i]表示第j个元素在第i个元素之前所能组成的最长递增子序列。

仔细思考一下,其实完全不用二维数组,只要将当前第i个元素能组成最长递增序列的值记录下来。求第j个元素的最大递增子序列时,只需将第j个元素和前j-1个元素依次比较,如果第j个元素大于第k个元素并且现在第j个元素此时最长递增子序列小于第K个元素的最长递增子序列长度加1,就更新第j个,元素所能组成的最长递增子序列的长度。

用一列数组存储每个元素最长递增子序列的前一个元素的位置,所以代码如下:

#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int v[10001]; int qian[10001]; int s[10001]; int pt[10001]; int n; int main() { int j,i; while(cin>>n&&n) { for(j=0;j<n;j++) { scanf("%d",s+j); v[j]=1; qian[j]=j; } for(j=1;j<n;j++) for(i=0;i<j;i++) if(s[j]>s[i]&&v[i]+1>v[j]) { v[j]=v[i]+1; qian[j]=i; } int tp=0,ma=1; for(j=1;j<n;j++) if(v[j]>ma) { ma=v[j]; tp=j; } i=0; while(qian[tp]!=tp) { pt[i]=s[tp]; i++; tp=qian[tp]; } pt[i]=s[tp]; for(j=i;j>0;j--) printf("%d ",pt[j]); printf("%d\n",pt[0]); } return 0; } /************************************************************** Problem: 1262 User: 午夜小白龙 Language: C++ Result: Accepted Time:20 ms Memory:1676 kb ****************************************************************/

转载请注明原文地址: https://www.6miu.com/read-4597.html

最新回复(0)