poj 1836 Alignment(双向LIS)
2018-03-28 16:48
477 查看
题目:点击打开链接
题意:
和vijos合唱队形一样,还是两遍矮,中间高,不一样的是时限要求。
思路:
还是正反两个LIS,但要换种写法,没必要外面套一层循环。
注意j==i时减一。#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1010;
int l[maxn],r[maxn];
double h[maxn];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>h[i];
fill(l,l+n,1); fill(r,r+n,1);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++)
if(h[j]<h[i])
l[i]=max(l[j]+1,l[i]);
}
for(int i=n-2;i>=0;i--){
for(int j=n-1;j>=i;j--)
if(h[j]<h[i])
r[i]=max(r[j]+1,r[i]);
}
int ans=0;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(j==i) ans=max(ans,l[i]+r[j]-1);
else ans=max(ans,l[i]+r[j]);
cout<<n-ans<<endl;
return 0;
}
题意:
和vijos合唱队形一样,还是两遍矮,中间高,不一样的是时限要求。
思路:
还是正反两个LIS,但要换种写法,没必要外面套一层循环。
注意j==i时减一。#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1010;
int l[maxn],r[maxn];
double h[maxn];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>h[i];
fill(l,l+n,1); fill(r,r+n,1);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++)
if(h[j]<h[i])
l[i]=max(l[j]+1,l[i]);
}
for(int i=n-2;i>=0;i--){
for(int j=n-1;j>=i;j--)
if(h[j]<h[i])
r[i]=max(r[j]+1,r[i]);
}
int ans=0;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(j==i) ans=max(ans,l[i]+r[j]-1);
else ans=max(ans,l[i]+r[j]);
cout<<n-ans<<endl;
return 0;
}
相关文章推荐
- POJ 1836 Alignment 双向LIS+DP
- POJ 1836 Alignment 枚举中间点双向求LIS
- POJ-1836-Alignment-双向LIS-注意double精度
- POJ 1836-Alignment(DP/LIS变形)
- POJ 1836 Alignment 变形的LIS
- POJ 1836 Alignment (线性dp LIS的两种姿势)
- POJ 1836 Alignment(LIS变形)
- poj-1836-Alignment解题报告 LIS
- POJ 1836(双向LIS)
- POJ1836 双向LIS
- POJ 1836 Alignment( LIS )
- POJ 1836--Alignment(LIS,LCS)
- POJ 1836 Alignment (动态规划LIS)
- POJ 1836 Alignment(LIS)
- POJ1836 - Alignment(LIS)
- POJ 1836 Alignment(DP LIS)
- POJ 1836-Alignment(DP/LIS变形)
- poj 1836 Alignment (LIS)
- poj 1836 Alignment(dp,LIS)
- POJ 1836 Alignment(DP | LIS)