poj1836动态规划+最长上升子序列变形+最长增和最长减然后找出分割点

来源:互联网 发布:淘宝刷单被发现怎么办 编辑:程序博客网 时间:2024/05/19 15:44

记录每个人左边的最大升序列中的人数(注意:他自己也算一个并且身高严格递增),记录每个人右边的最大严格降序列的人数,也包括他自己。

然后代码中有第二种身高序列的处理。

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<cmath>using namespace std;#define N 1005int up[N],down[N];double Arr[N];int main(){     int n=0,i=0,j=0,maxn=0;     scanf("%d",&n);     for(i=0;i<n;i++)     {         scanf("%lf",&Arr[i]);     }     for(i=0;i<n;i++)     {         up[i]=down[i]=1;     }     for(i=1;i<n;i++)     {         maxn=0;         for(j=0;j<i;j++)         {             if(Arr[j]<Arr[i]&&up[j]>maxn)             {                 maxn=up[j];             }         }         up[i]=maxn+1;     }     for(i=n-1;i>=0;i--)     {         maxn=0;         for(j=i+1;j<n;j++)         {             if(Arr[j]<Arr[i]&&down[j]>maxn)             {                 maxn=down[j];             }         }         down[i]=maxn+1;     }     int tmp=0;     for(i=0;i<n-1;i++)//通过改变切割点来划分需要的减少最少的点     {         for(j=i+1;j<n;j++)         {             if(up[i]+down[j]>tmp)             {                 tmp=up[i]+down[j];             }         }     }     printf("%d\n",n-tmp); return 0;}

0 0