poj 1836 dp lis

来源:互联网 发布:3d教学软件 编辑:程序博客网 时间:2024/06/05 07:19

2015/2/12


最长上升子序列

一开始没看明白就埋头乱搞。

两次lis 取max 就提交(wa)了


其实  

7

1 2 3 4 3 2 1

输出是

7


这样子,都明白了吧= = 

做法:还是lis两遍 然后是 dp1[i ] + dp2[ j]  i <j取max


#include<map>#include<queue>#include<stack>#include<cmath>#include<vector>#include<climits>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;  #define mod 10007#define lson pos<<1,l,mid#define sc(n) scanf("%d",&n)#define rson pos<<1|1,mid+1,r#define pr(n) printf("%d\n",n)#define met(n,m) memset(n, m, sizeof(n))#define F(x,y,i) for(int i = x;i > y; i--)#define f(x,y,i) for(int i = x;i < y; i++)#define ff(x,y,i) for(int i = x;i <= y; i++)#define FF(x,y,i) for(int i = x;i >= y; i--) const int N=100500;const int inf = INT_MAX;int Max(int a,int b){return a>b?a:b;}int Min(int a,int b){return  a<b?a:b;}double s[1005];int dp1[1005];int dp2[1005];int main()  {      int n, m, tot, x;    while(~scanf("%d",&n))    {    int minn;    f(0,n,i){scanf("%lf",&s[i]);} f(0,n,i)dp1[i] = 1;f(0,n,i)f(0,i,j){if(s[i] > s[j]){dp1[i] =  Max(dp1[i],dp1[j] + 1);}}f(0,n,i)dp2[i] = 1;for(int i = n-1;i >= 0; i--){for(int j = n-1;j > i; j--){if(s[i] > s[j]){dp2[i] =  Max(dp2[i],dp2[j] + 1);}}}int maxn = 0;f(0,n,i){for(int j = i+1;j < n; j++){maxn = Max(maxn,dp1[i]+dp2[j]);}}printf("%d\n",n - maxn);        }    return 0;  }  


 


0 0