1264:【例9.8】合唱队形

合唱队形

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int N=105;
 5 
 6 int a[N],b[N],c[N];
 7 int main(){
 8     int n,t,maxx=0;
 9     cin>>n;
10     for(int i=1;i<=n;i++)
11         scanf("%d",&a[i]);
12     for(int i=1;i<=n;i++){
13         b[i]=1;
14         for(int j=i-1;j>0;j--)
15             if(a[i]>a[j])b[i]=max(b[i],b[j]+1);
16     }
17     for(int i=n;i>0;i--){
18         c[i]=1;
19         for(int j=i+1;j<=n;j++)
20             if(a[i]>a[j])c[i]=max(c[i],c[j]+1);
21     }
22     for(int i=1;i<=n;i++)maxx=max(maxx,b[i]+c[i]);
23     printf("%d",n-maxx+1);
24     return 0;
25 }

 

无参考价值,只拿了30分,只是不知道错误原因,所以贴在这。

更新:错误原因应该在于一次遍历不能使得解的子集是最优子集解。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int N=105;
 5 
 6 int a[N],b[N],f[N];
 7 int main(){
 8     int n,t,maxx=0;
 9     cin>>n;
10     for(int i=1;i<=n;i++)
11         scanf("%d",&a[i]);
12     for(int i=1;i<=n;i++){
13         f[i]=1;
14         for(int j=i-1;j>0;j--){
15             if(f[j]+1==f[i]&&a[i]>a[j]&&!b[j]&&b[i])b[i]=0;
16             if(f[j]+1>f[i]&&a[i]!=a[j]){
17                 if(a[i]>a[j]&&b[j])continue;
18                 if(a[i]<a[j])b[i]=1;
19                 f[i]=f[j]+1;
20             }
21         }
22         maxx=max(maxx,f[i]);
23     }
24     printf("%d",n-maxx);
25     return 0;
26 }

 

posted @ 2021-08-14 18:48  Rekord  阅读(445)  评论(0编辑  收藏  举报