acwing1017/《信息奥赛一本通》
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int dp[1010];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for( int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int ans=0;
memset(dp,0,sizeof(dp));
for( int i=1;i<=n;i++){
dp[i]=1;
for( int j=0;j<=i-1;j++){
if(a[i]>a[j])
dp[i]=max(dp[j]+1,dp[i]);
}
}
for( int i=1;i<=n;i++) ans=max(ans,dp[i]);
memset(dp,0,sizeof(dp));
for( int i=1;i<=n;i++){
dp[i]=1;
for( int j=0;j<=i-1;j++){
if(a[i]<a[j]){
dp[i]=max(dp[i],dp[j]+1 );
}
}
}
for( int i=1;i<=n;i++) ans=max(ans,dp[i]);
cout<<ans<<endl;
}
}
acwing 1014登山 /《信息学奥赛一本通》
#include<bits/stdc++.h>
using namespace std;
int a[1100];
int dp1[1010];
int dp2[1010];
int main(){
int n;
cin>>n;
for( int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for( int i=1;i<=n;i++){
dp1[i]=1;
for( int j=0;j<=i-1;j++){
if(a[i]>a[j]){
dp1[i]=max(dp1[j]+1,dp1[i]);
}
}
}
for( int i=n;i>=1;i--){
dp2[i]=1;
for( int j=n;j>=i-1;j--){
if(a[i]>a[j]){
dp2[i]=max(dp2[j]+1,dp2[i]);
}
}
}
for( int i=1;i<=n;i++){
ans=max(ans,dp1[i]+dp2[i]);
}
cout<<ans-1<<endl;
}
acwing 482合唱队形
#include<bits/stdc++.h>
using namespace std;
int a[1100];
int dp1[1010];
int dp2[1010];
int main(){
int n;
cin>>n;
for( int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for( int i=1;i<=n;i++){
dp1[i]=1;
for( int j=0;j<=i-1;j++){
if(a[i]>a[j]){
dp1[i]=max(dp1[j]+1,dp1[i]);
}
}
}
for( int i=n;i>=1;i--){
dp2[i]=1;
for( int j=n;j>=i-1;j--){
if(a[i]>a[j]){
dp2[i]=max(dp2[j]+1,dp2[i]);
}
}
}
for( int i=1;i<=n;i++){
ans=max(ans,dp1[i]+dp2[i]);
}
cout<<n-ans+1<<endl;
}
友好城市/《信息学奥赛一本通》
#include<bits/stdc++.h>
using namespace std;
struct p{
int l;
int r;
}a[5010];
int dp[5010];
int cmp( p a,p b){
return a.l<b.l;
}
int main(){
int n;
cin>>n;
for( int i=1;i<=n;i++){
cin>>a[i].l;
cin>>a[i].r;
}
sort(a+1,a+1+n,cmp);
for( int i=1;i<=n;i++){
dp[i]=1;
for( int j=1;j<=i-1;j++){
if(a[i].r>a[j].r){
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int ans=0;
for( int i=1;i<=n;i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
最长上升子序列和/《信息学奥赛一本通》
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int dp[1010];
int sum[1010];
int main(){
int n;
cin>>n;
for( int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for( int i=1;i<=n;i++){
sum[i]=a[i];
for( int j=1;j<=i-1;j++){
if(a[i]>a[j]){
sum[i]=max(sum[i],sum[j]+a[i]);
}
}
}
for( int i=1;i<=n;i++){
ans=max(ans,sum[i]);
}
cout<<ans;
}