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 }