poj 1836 Alignment(dp)

题目:http://poj.org/problem?id=1836

题意:最长上升子序列问题, 站队,求踢出最少的人数后,使得队列里的人都能看到 左边的无穷远处 或者 右边的无穷远处。

代码O(n^2):

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n,i,j,d1[1100],d2[1100],mx;
 8     double a[1100];
 9     cin>>n;
10     for(i=1; i<=n; i++)
11         cin>>a[i];
12     d1[1]=1;
13     for(i=2; i<=n; i++)
14     {
15         mx=1;
16         for(j=1; j<i; j++)
17             if(a[i]-a[j]>0&&d1[j]>=mx)
18             {
19                 mx=d1[j]+1;
20             }
21         d1[i]=mx;
22     }
23     d2[n]=1;
24     for(i=n-1; i>=1; i--)
25     {
26         mx=1;
27         for(j=n; j>i; j--)
28             if(a[i]-a[j]>0&&d2[j]>=mx)
29             {
30                 mx=d2[j]+1;
31             }
32         d2[i]=mx;
33     }
34     mx=-1;
35     for(i=1; i<=n; i++)
36         for(j=i+1; j<=n; j++)
37             if(d1[i]+d2[j]>mx)
38                 mx=d1[i]+d2[j];
39     cout<<n-mx<<endl;
40     return 0;
41 }

 

 

posted @ 2013-10-26 19:50  水门  阅读(154)  评论(0编辑  收藏  举报