最長遞增子序列(LIS)
例7.3 攔截導彈
代碼7.3
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
int a[25];
int x[25];
while(cin >> n){
for(int i=0;i<n;i++)
cin >> a[i];
for(int i=0;i<n;i++){
int tmax = 1;
for(int j=0;j<i;j++){
if(a[i]<=a[j])
tmax = max(tmax,x[j] + 1);
}
x[i] = tmax;
}
int max = 0;
for(int i=0;i<n;i++){
if(max < x[i])
max = x[i];
}
cout << max << endl;
}
return 0;
}
合唱隊形
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
int a[105];
int xl[105];
int xr[105];
while(cin >> n){
for(int i=0;i<n;i++)
cin >> a[i];
for(int i=0;i<n;i++){
int tmax = 1;
for(int j=0;j<i;j++){
if(a[i] > a[j])
tmax = max(tmax,xl[j] + 1);
}
xl[i] = tmax;
}
for(int i=n-1;i>=0;i--){
int tmax = 1;
for(int j=n-1;j>i;j--){
if(a[j] < a[i])
tmax = max(tmax,xr[j] + 1);
}
xr[i] = tmax;
}
int max = 0;
for(int i=0;i<n;i++)
if(xl[i] + xr[i] -1 > max)
max = xl[i] + xr[i] - 1;
cout << n - max << endl;
}
return 0;
}