萌新求救P1091

P1091 [NOIP2004 提高组] 合唱队形

@[浅夏琉璃](/space/show?uid=176960) ``` for(int i=1;i<=m;++i) { for(int j=1;j<i;++j) if(c[i]>c[j]) d[i]=max(d[i],d[j]+1); if(b[i]>sum) sum=b[i];//这里不是d[i]嘛 } ```
by Vivian_IMproved @ 2019-02-16 19:12:21


而且我觉得您应该强制选一个才对吧
by Vivian_IMproved @ 2019-02-16 19:14:06


@[Vivian_IMproved](/space/show?uid=144006) dalao。现在是40,就按您的方式。。 ```cpp #include<bits/stdc++.h> using namespace std; int a[110],b[110],c[110],d[110]; int main() { int n; cin>>n; for(int i=1;i<=n;++i) b[i]=d[i]=1; for(int i=1;i<=n;++i) { cin>>a[i]; c[n-i+1]=a[i]; } int o=0,p=0; for(int k=1;k<=n;++k) { int num=0,sum=0; for(int i=1;i<=k;++i) { for(int j=1;j<i;++j) if(a[i]>a[j]) b[i]=max(b[i],b[j]+1); if(b[i]>num) num=b[i]; } int m=n-k+1; for(int i=1;i<=m;++i) { for(int j=1;j<i;++j) if(c[i]>c[j]) d[i]=max(d[i],d[j]+1); if(b[i]>sum) sum=d[i]; } if(o+p<sum+num) { o=num; p=sum; } } cout<<n-o-p+1<<endl; return 0; } ```
by 浅夏琉璃 @ 2019-02-16 19:22:27


@[浅夏琉璃](/space/show?uid=176960) 其实我觉得您应该强制选当前节点,否则没办法保证两边拼起来的时候满足条件啊
by Vivian_IMproved @ 2019-02-16 19:23:58


|