hrbust 哈理工OJ 2010 二等队形【dp】【最长递减子序列问题】

来源:互联网 发布:excel如何录入数据 编辑:程序博客网 时间:2024/05/17 03:00

二等队形Time Limit: 1000 MSMemory Limit: 32768 KTotal Submit: 311(97 users)Total Accepted: 145(92 users)Rating: Special Judge: NoDescription

所谓二等队形就是从大到小依次排列,即对于数列a,二等队形为任意a【i】满足:a【i】>a【i+1】。

现在给出一个长度为n的数列,从中最少去除多少个数可使数列变成二等队形数列。


Input

多组输入数据。

第一行输入n(0<n<1000)。

第二行输入长度为n的数列a(0<ai<100000)。

Output

最少去除的元素的个数。

Sample Input
56 1 4 2 3
Sample Output
2
Source2014 Winter Holiday Contest 2


问最少去除元素的个数,其实就是让我们先找到最长递减子序列,然后再用整个长度减去这个长度,就是输出:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int a[10000];int dp[10000];int main(){    int n;    while(~scanf("%d",&n))    {        memset(dp,0,sizeof(dp));        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);        }        reverse(a,a+n);//重新让递减变成递增问题        int ans=1;        dp[0]=1;        for(int i=1;i<n;i++)        {            int max=0;            for(int j=0;j<n;j++)            {                if(a[i]>a[j]&&max<dp[j])max=dp[j];            }            dp[i]=max+1;            if(dp[i]>=ans)ans=dp[i];        }        printf("%d\n",n-ans);    }}








0 0
原创粉丝点击